【问题标题】:Invoking macros with one argument使用一个参数调用宏
【发布时间】:2012-09-30 12:30:55
【问题描述】:

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

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

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

根据 GCC 文档中的this page,这应该是不可能的。

【问题讨论】:

    标签: c++ c macros


    【解决方案1】:

    再次阅读 GCC 文档的那一页;它区分了 empty 参数和 missing 参数。给定

    #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 */
    

    【讨论】:

    • 感谢您的回答,看来您是对的。此外,我发现a similar SO post,其中接受的答案指出,即使使用 C99 标准,空宏参数也应该是合法的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 2013-11-01
    • 2019-01-28
    相关资源
    最近更新 更多