以下C宏有什么作用?

时间:2013-05-28 01:10:39

标签: c

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

C中的##是什么意思?这是占位符还是功能?

4 个答案:

答案 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_tlong,因此常量应为123L。在大多数32位系统和Windows上,int64_tlong long,因此常量应为123LL