#ifndef INT64_C
#define INT64_C(c) (c ## LL)
#define UINT64_C(c) (c ## ULL)
#endif
## 在 C 中是什么意思?那是占位符还是函数?
#ifndef INT64_C
#define INT64_C(c) (c ## LL)
#define UINT64_C(c) (c ## ULL)
#endif
## 在 C 中是什么意思?那是占位符还是函数?
不,##
不是函数的占位符,它是令牌粘贴运算符。它仅在预处理器宏内部有效(带或不带参数)。它产生其左侧和右侧的串联。
例如,如果您传递INT64_C
一个值123
INT64_C(123)
预处理器产生的结果相当于写
123LL
这些宏背后的想法是使有符号和无符号常量在代码中更加突出一点:看起来像的值INT64_C(123)
可能比等效的123LL
. 这绝对是对其他等价物的巨大改进123ll
,后者看起来完全不同。
##
意味着连接两个标记。
所以(c ## LL)
会被预处理到cLL
.
但请注意,它是在预处理阶段完成的,所以它不像strcat
.
int i = 3;
INT64_C(i);
将生成iLL
而不是3LL
.
正如其他人提到的,##
将两个标记粘贴在一起。
#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
.