求解:变参宏定义

求解:变参宏定义


    看《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参数对付宏和模版的调试很好用。。。

你可能感兴趣的:(求解:变参宏定义)