c++ - 使用一个参数调用宏

标签 c++ c macros

最近我在浏览 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/

相关文章:

c++ - 在 Microsoft Visual Studio 2010 中添加 .lib 文件

c++ - boost Python(Suse 和 Ubuntu)

Control-C 和 C 中的信号处理

eclipse - Eclipse 中带有键盘快捷键的宏功能?

c - 将数组分配给函数宏

c++ - 如何识别boost fusion vector 中的类型

c++ - 为什么 Doxygen 文档只出现在多个相邻组的最后一个?

c++ - 您如何以编程方式确定二进制输出中的构建系统等效性?

c++ - 关于Makefile的一些问题

c - 预处理 token : '- -' vs. '--'