长度可变的C语言宏
在上大学的时候,对printf就有非常困惑的疑问,因为它的原型是这样的:
int printf(const char *fmt, ...);
现在则需要另外一个类似的东西:长度可变的宏定义
以下是两种方案,clang和gcc均测试通过。
CASE 1:
ISO c99标准里边定义了一个预处理宏__VA_ARGS__,可以像这样来定义一个println:
#define println(fmt, ...) printf(fmt"\n", __VA_ARGS__) println("%d", 1); println("%d", 2);
这个宏的麻烦之处在于,它代表1个以上的参数,它本身不代表空,所以如果你打算这样用就会有问题:
println("hello world!");
跟printf匹配的是这样的定义:
#define println(...) printf(__VA_ARGS__)
这样虽然跟printf是完全一样了,可println也无法在fmt后边添加new line了,总之就是,__VA_ARGS__至少代表1个值。
CASE 2:
GNU GCC给出了另外一种方案,蹊跷的是这种方案在加上-std=c99之后编译也是可以的,定义如下:
#define println(fmt, ARGS...) printf(fmt"\n", ##ARGS) println("hello world."); println("%d", 1); println("%d %d", 2, 3);
这里的##ARGS可以代表0个以上的参数,这是它与__VA_ARGS__的差别,应用不同看个人口味了。