【问题标题】:Is semicolon ignored in C macro?C宏中是否忽略分号?
【发布时间】:2015-09-05 02:50:20
【问题描述】:
#define A;

#ifdef A
    (...)
#endif

我以为前任会认为这是错误的;但是它会进入这种状态。是A和A;一样吗?

【问题讨论】:

    标签: c macros


    【解决方案1】:

    不,它们是不同的。

    #define A;
    

    A; 是两个不同的标记。 A 是宏名称,; 是它的定义。所以你可以,如果你真的想,写:

    printf("Hello, world\n")A
    

    它相当于

    printf("Hello, world\n");
    

    (但请不要那样做。)

    由于您对A 所做的唯一事情就是在#ifdef 中引用它,因此您所做的就是测试它是否已被定义,而不管它是如何定义的。分号无关紧要,因为您不使用它。

    出于风格和清晰度的考虑,您应该始终在宏名称和它的定义之间留一个空格:

    #define A ;
    

    如果扩展的第一个标记是( 字符,这一点尤其重要。如果它紧跟在宏名称之后,则您有一个类似函数的宏定义(宏接受参数)。如果宏名称和( 之间有空格,则( 只是宏扩展的一部分。

    说到分号,一个常见的错误是在宏定义中包含不必要的分号:

    #define THE_ANSWER 42;
    
    ...
    
    printf("The answer is %d\n", THE_ANSWER);
    

    由于分号是宏定义的一部分,因此扩展为:

    printf("The answer is %d\n", 42;);
    

    这是一个语法错误。

    【讨论】:

    • @KeithThompson 为什么要 A;不会被视为一个完整的宏名称?
    • @Renjie:因为宏名必须是标识符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 2022-06-23
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    • 1970-01-01
    相关资源
    最近更新 更多