2013-05-28 4 views
6
#ifndef INT64_C 
#define INT64_C(c) (C## LL) 
#define UINT64_C(c) (C## ULL) 
#endif 

Что означает ## в C? Это заполнитель или функция?Что делает следующий макрос C?

+2

Я рекомендую «Язык программирования C» в главе 4 раздела 11, и вы узнаете все о макросогласовании в C – shengy

+0

@Jens Рассмотрим 'INT64_C (2 + 2) * 100' - здесь, чтобы получить ожидаемый результат 400, скобки нужны – anatolyg

+0

@anatolyg Вы правы, я об этом не думал. Хороший улов! Комментарий удален. – Jens

ответ

10

Он называется token pasting operator, он объединяет токены, так что 123313 ## LL становится 123313LL во время предварительной обработки.

Существует также stringification operator#, который преобразует #name в "name".

4

No, ## не является заполнителем для функции, это оператор точечного приклеивания. Он действителен только внутри макросов препроцессора (с параметрами или без них). Он создает конкатенацию левой и правой сторон.

Например, если вы передаете INT64_C значение 123

INT64_C(123) 

результат производства препроцессора будет эквивалентно записи

123LL 

Идея этих макросов сделать подписаны и неподписанные константы выделяются в коде немного больше: значение, которое выглядит как INT64_C(123), может быть немного более читаемым, чем эквивалент 123LL. Это, безусловно, большое улучшение по сравнению с другим эквивалентом 123ll, который выглядит совершенно другим числом.

4

## означает объединить два токена.

Таким образом, (C## LL) будет предварительно обработан до cLL.

Но обратите внимание, это делается на стадии предварительной обработки, так что это не так, как strcat.

int i = 3; 
INT64_C(i); 

будет генерировать iLL вместо 3LL.

+0

два токена, а не две строки. – Elazar

+0

Спасибо, исправлено. –

2

Как уже упоминалось, ## вставляет два жетона вместе.

#define INT64_C(c) (C## LL) 

Так, INT64_C(123) становится (123LL) после макроподстановок.

Эти макросы существуют, поэтому вы можете портативно использовать константы int64_t. На большинстве 64-битных систем, макрокоманда будет определяться как, например:

#define INT64_C(c) (C## L) 

Это потому, что на большинстве 64-битных систем, int64_t является long поэтому константа должна быть 123L. В большинстве 32-разрядных систем и в Windows int64_t - long long, поэтому константа должна быть 123LL.

Смежные вопросы