下面的C宏是做什么的?

下面的C宏是做什么的?,c,C,在C中##是什么意思?这是占位符还是函数?它被称为,它连接令牌,以便在预处理期间123313##LL变为123313LL 还有一个#,它将#name转换为“name”否,#不是函数的占位符,它是一个标记粘贴操作符。它仅在预处理器宏内有效(带或不带参数)。它将生成其左侧和右侧的连接 例如,如果您传递INT64_C值123 #ifndef INT64_C #define INT64_C(c) (c ## LL) #define UINT64_C(c) (c ## ULL) #endif 预处理器产

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

它被称为,它连接令牌,以便在预处理期间
123313##LL
变为
123313LL

还有一个
#
,它将
#name
转换为
“name”
否,
#
不是函数的占位符,它是一个标记粘贴操作符。它仅在预处理器宏内有效(带或不带参数)。它将生成其左侧和右侧的连接

例如,如果您传递
INT64_C
123

#ifndef INT64_C
#define INT64_C(c) (c ## LL)
#define UINT64_C(c) (c ## ULL)
#endif
预处理器产生的结果相当于写入

INT64_C(123)
这些宏背后的思想是使有符号和无符号常量在代码中更加突出:看起来像
INT64_C(123)
的值可能比等效的
123LL
更可读。它与另一个等价的
123ll
相比无疑是一个很大的改进,后者看起来像是一个完全不同的数字。

##
意味着连接两个令牌

因此
(c#LL)
将被预处理为
cLL

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

123LL

将生成
iLL
而不是其他人提到的
3LL
将两个令牌粘贴在一起

int i = 3;
INT64_C(i);
因此,在宏展开后,
INT64_C(123)
变为
(123LL)

这些宏的存在使您可以方便地使用
int64\t
常量。在大多数64位系统上,宏的定义如下:

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

这是因为在大多数64位系统上,
int64\u t
long
,因此常数应该是
123L
。在大多数32位系统和Windows上,
int64_t
long-long
,因此常量应该是
123LL

两个标记,而不是两个字符串。我推荐
C编程语言
第4章第11节,您将了解C@Jens考虑<代码> iTnx16c(2 + 2)* 100 < /代码>要获得预期结果400,括号为required@anatolyg你说得对,我没想到。抢手货删除评论。
#define INT64_C(c) (c ## L)