【问题标题】:Confusing gcc error message in simple macro expansion简单宏扩展中令人困惑的 gcc 错误消息
【发布时间】:2013-04-14 21:33:17
【问题描述】:

我看这个太久了,就是看不出问题所在:

#include <stdio.h>

typedef struct {
    int a;
    int b;
} S;

#define F(a,b) ( v.a = a, v.b = b, v )

int main(void) {
    S s, v;

    s = ( v.a = 1, v.b = 2, v ); // this works as expected

    printf("s = { %d %d } \n", s.a, s.b);

    s = F(1, 2); // but gcc complains about the macro equivalent

    printf("s = { %d %d } \n", s.a, s.b);

    return 0;
}

gcc 抱怨:

在函数'main'中:
第 17 行:错误:数字常量之前的预期标识符

预处理后这两个分配应该是相同的,但显然我遗漏了一些东西......

你可以在这里运行代码:http://codepad.org/0c1aUBLm

【问题讨论】:

    标签: c gcc macros c-preprocessor


    【解决方案1】:
    #define F(a,b) ( v.a = a, v.b = b, v )
    

    当使用 1 和 2 作为参数调用时,它会扩展为

    ( v.1 = 1, v.2 = 2, v)
    

    将宏的参数名称更改为不同的名称:

    #define F(first,second) ( v.a = first, v.b = second, v )
    

    【讨论】:

    • D'oh - 我知道它必须简单明了,但我就是看不到 - 谢谢...
    • @PaulR 我假设你很累 :) 喝点咖啡/睡觉 :)
    • 你是正确的 - 大脑功能刚刚严重耗尽。 ;)
    【解决方案2】:

    F(1, 2) 不会扩展为 ( v.1 = 1, v.2 = 2, v ) 吗?

    #define F(x,y) ( v.a = x, v.b = y, v )
    

    应该会更好

    【讨论】:

    • 谢谢@simonc - H2CO3 以微弱优势击败了你,但无论如何都要投赞成票...... ;)
    猜你喜欢
    • 1970-01-01
    • 2022-11-22
    • 2016-02-09
    • 2014-10-11
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多