7
#ifndef INT64_C
#define INT64_C(c) (c ## LL)
#define UINT64_C(c) (c ## ULL)
#endif

## 在 C 中是什么意思?那是占位符还是函数?

4

4 回答 4

10

它被称为令牌粘贴运算符,它连接令牌,以便在预处理期间成为123313 ## LL123313LL

还有一个字符串化操作符 #,它转换#name"name".

于 2013-05-28T01:11:57.147 回答
4

不,##不是函数的占位符,它是令牌粘贴运算符。它仅在预处理器宏内部有效(带或不带参数)。它产生其左侧和右侧的串联。

例如,如果您传递INT64_C一个值123

INT64_C(123)

预处理器产生的结果相当于写

123LL

这些宏背后的想法是使有符号和无符号常量在代码中更加突出一点:看起来像的值INT64_C(123)可能比等效的123LL. 这绝对是对其他等价物的巨大改进123ll,后者看起来完全不同。

于 2013-05-28T01:12:26.923 回答
4

##意味着连接两个标记。

所以(c ## LL)会被预处理到cLL.

但请注意,它是在预处理阶段完成的,所以它不像strcat.

int i = 3;
INT64_C(i);

将生成iLL而不是3LL.

于 2013-05-28T01:13:20.310 回答
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.

于 2013-05-28T01:15:32.023 回答