1.Preprocessor Glue: The ## Operator 预处理连接符:##操作符 Like the # operator, the ## operator can be used in the replacement section of a function-like macro.Additionally, it can be used in the replacement section of an object-like macro. The ## operator co
前阵子仔细重新研究了一下C的宏展开.总结起来,有以下几个主要规则: 每次宏展开的结果会被重复扫描,直到没有任何可展开的宏为止. 每展开一个宏,都会记住这次展开,在这个宏展开的结果及其后续展开中,不再对相同的宏做展开. 带参数的宏,先对参数做展开,除非宏定义体中包含#或## a) #表示将后续标识符转换为字符串 b) ##表示将两个标识符连接成一个标识符 c) 注意参数展开的结果中即使有逗号(,),也不视为参数的分隔符 如果宏定义中带有参数,而代码中出现同样标识符时没有参数,不视为宏. 下面的三段
C中宏展开问题 简单记录一下碰到的问题. #define STR(x) #x 我们知道使用上面的宏可以将x转换为字符串"x". 但是如果这样用: #define NUM 3 #define STR(x) #x STR(NUM) --> 实际输出为:"NUM". 这是为啥呢?C99标准中有一段话: ... After the arguments for the invocation of a function-like macro have been ident
语句表达式的亮点在于定义复杂功能的宏.使用语句表达式来定义宏,不仅可以实现复杂的功能,而且还能避免宏定义带来的歧义和漏洞.下面以一个简单的最小值的宏为例子一步步说明. 1.灰常简单的么,使用条件运算符就能完成,不就是 #define MIN(x,y) x > y ? y : x 当然这是最基本的 C 语言语法,可以写一个测试程序,验证一下我们定义的宏的正确性 #include <stdio.h> #define MIN(x,y) x < y ? y : x int main(int