最近我在浏览 SO 时遇到了 this topic ,其中 Sam Jansen 正在声明一个宏 PACKED_STRUCT(name)
,但在代码中他使用它一次没有参数,一次使用提供的名称参数。
我试图用 GCC 4.6.1 编译一个类似的示例程序,令我惊讶的是它编译得很好,根本没有任何警告(我使用的是 -std=c99 -Wall -Wextra -pedantic
命令线开关)。
但是,当我尝试制作两个参数宏并使用少于两个参数调用它时,它不起作用。
所以我的问题是,如果这是 GCC 中的一个错误,或者它是 GCC 的一个特性,或者它在标准的某处定义,那么它必须像这样工作吗?
根据 this page在 GCC 的文档中,这是不可能的。
最佳答案
再次阅读 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 */
关于c++ - 使用一个参数调用宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12661258/