看《xxx的自我修养》里面有一段关于“变长参数宏”的代码:
#include <stdio.h>
#define printf(args ) fprintf(stdout, ##args)
int main()
{
printf("\n%d, %s\n", 0, "test");
return 0;
} 代码不长,编译也未见问题,结果也正常,演示了其想说明的部分。根据其意,‘##’宏用于字符串的连接操作,即将参数‘args’部分连接成一个字符串传给fprintf函数。但我认为宏定义本身就是‘字符串的替换’,完全不需要‘##’,即,传人的‘args’是什么,fprintf被传人的也是什么,不会有任何变化,也无需作任何操作,因此我修改宏如下:
#define printf(args ) fprintf(stdout, args) 嗯,我获得了相同的正常结果。
从结果看,我认为《自我修养》想通过这个例子说明‘##’的使用方式,是不太恰当的。下面是我使用的GCC的版本信息:
Reading specs from /usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.3.2/specs
Configured with: ../configure --with-as=/usr/ccs/bin/as --with-ld=/usr/ccs/bin/ld --disable-nls
Thread model: posix
gcc version 3.3.2
现在问题是这个‘...’了。
如果说,宏定义本身就是‘字符串的替换’,那么,这里‘...’应该没有任何用处。于是,修改宏如下:
#define printf(args) fprintf(stdout, args)
结果编译得到如下错误:
print.cpp:7:38: macro "printf" passed 3 arguments, but takes just 1
为什么会这样?没找到原因,无论对args加上‘##’,还是‘()’,都是一样的错误结果。
实话说,我从未写过类似'args ...'这样的参数,按我的理解,这语法检查的实话就应该出差了,但事实却没有。
各位对'...'的用法有啥见解?
<----自作聪明的分割线---->
g++的 -C -E参数对付宏和模版的调试很好用。。。