#ifndef INT64_C
#define INT64_C(c) (c ## LL)
#define UINT64_C(c) (c ## ULL)
#endif
C中的##是什么意思?这是占位符还是功能?
答案 0 :(得分:10)
它被称为token pasting operator,它会连接令牌,以便在预处理过程中123313 ## LL
变为123313LL
。
还有stringification operator #
,可将#name
转换为"name"
。
答案 1 :(得分:4)
不,##
不是函数的占位符,它是一个标记粘贴运算符。它仅在预处理器宏内(有或没有参数)有效。它产生左右两侧的串联。
例如,如果您将INT64_C
的值123
INT64_C(123)
123LL
预处理器产生的结果等同于编写
INT64_C(123)
这些宏背后的想法是使代码中的有符号和无符号常量更加突出:看起来像123LL
的值可能比等效的123ll
更具可读性。对于其他等价的{{1}}来说,它肯定是一个很大的改进,看起来像是一个完全不同的数字。
答案 2 :(得分:4)
##
表示连接两个令牌。
因此(c ## LL)
会被预处理为cLL
。
但要注意,它是在预处理阶段完成的,所以它不像strcat
。
int i = 3;
INT64_C(i);
将生成iLL
而不是3LL
。
答案 3 :(得分: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
。