#ifndef INT64_C
#define INT64_C(c) (C## LL)
#define UINT64_C(c) (C## ULL)
#endif
Что означает ## в C? Это заполнитель или функция?Что делает следующий макрос C?
#ifndef INT64_C
#define INT64_C(c) (C## LL)
#define UINT64_C(c) (C## ULL)
#endif
Что означает ## в C? Это заполнитель или функция?Что делает следующий макрос C?
Он называется token pasting operator, он объединяет токены, так что 123313 ## LL
становится 123313LL
во время предварительной обработки.
Существует также stringification operator#
, который преобразует #name
в "name"
.
No, ##
не является заполнителем для функции, это оператор точечного приклеивания. Он действителен только внутри макросов препроцессора (с параметрами или без них). Он создает конкатенацию левой и правой сторон.
Например, если вы передаете INT64_C
значение 123
INT64_C(123)
результат производства препроцессора будет эквивалентно записи
123LL
Идея этих макросов сделать подписаны и неподписанные константы выделяются в коде немного больше: значение, которое выглядит как INT64_C(123)
, может быть немного более читаемым, чем эквивалент 123LL
. Это, безусловно, большое улучшение по сравнению с другим эквивалентом 123ll
, который выглядит совершенно другим числом.
##
означает объединить два токена.
Таким образом, (C## LL)
будет предварительно обработан до cLL
.
Но обратите внимание, это делается на стадии предварительной обработки, так что это не так, как strcat
.
int i = 3;
INT64_C(i);
будет генерировать iLL
вместо 3LL
.
два токена, а не две строки. – Elazar
Спасибо, исправлено. –
Как уже упоминалось, ##
вставляет два жетона вместе.
#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
.
Я рекомендую «Язык программирования C» в главе 4 раздела 11, и вы узнаете все о макросогласовании в C – shengy
@Jens Рассмотрим 'INT64_C (2 + 2) * 100' - здесь, чтобы получить ожидаемый результат 400, скобки нужны – anatolyg
@anatolyg Вы правы, я об этом не думал. Хороший улов! Комментарий удален. – Jens