huyc

导航

长度可变的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__的差别,应用不同看个人口味了。

posted on 2012-10-26 16:28  huyc  阅读(561)  评论(0编辑  收藏  举报