使用一个参数调用宏

时间:2012-09-30 12:30:55

标签: c++ c macros

最近我浏览了SO而且我遇到this topic,其中Sam Jansen声明了一个宏PACKED_STRUCT(name),但在代码中他使用了一次没有参数,一次使用了name参数。

我尝试用GCC 4.6.1编译一个类似的示例程序,我很惊讶它编译得很好而没有任何警告(我使用的是-std=c99 -Wall -Wextra -pedantic命令行开关)。 但是当我尝试创建两个参数宏并用少于两个参数调用它时,它不起作用。

所以我的问题是,如果这是GCC中的一个错误,或者它是GCC的一个功能,或者它是否在标准的某个地方定义,它必须像这样工作?

根据海湾合作委员会文件中的this page,这是不可能的。

1 个答案:

答案 0 :(得分:3)

再次阅读GCC文档的页面;它区分了参数和缺少参数。给定

#define ONE(x)    one(x)
#define TWO(x,y)  two(x,y)

就预处理器而言,所有这些都非常好(评论中的扩展):

ONE(1)    /* one(1)   */
ONE()     /* one()    */
TWO(1,2)  /* two(1,2) */
TWO(1,)   /* two(1,)  */
TWO(,2)   /* two(,2)  */
TWO(,)    /* two(,)   */

但这不合适:

TWO()     /* error: macro "TWO" requires 2 arguments, but only 1 given */