最近我浏览了SO而且我遇到this topic,其中Sam Jansen声明了一个宏PACKED_STRUCT(name)
,但在代码中他使用了一次没有参数,一次使用了name参数。
我尝试用GCC 4.6.1编译一个类似的示例程序,我很惊讶它编译得很好而没有任何警告(我使用的是-std=c99 -Wall -Wextra -pedantic
命令行开关)。
但是当我尝试创建两个参数宏并用少于两个参数调用它时,它不起作用。
所以我的问题是,如果这是GCC中的一个错误,或者它是GCC的一个功能,或者它是否在标准的某个地方定义,它必须像这样工作?
根据海湾合作委员会文件中的this page,这是不可能的。
答案 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 */