下面的C宏是做什么的?
在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 预处理器产
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)