3

最近我正在浏览 SO,我遇到了这个主题,Sam Jansen 在其中声明了一个宏PACKED_STRUCT(name),但在代码中他使用它一次没有参数,一次使用提供的 name 参数。

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

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

根据GCC 文档中的这个页面,这应该是不可能的。

4

1 回答 1

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 */
于 2012-09-30T12:41:36.730 回答