2013-04-14 17 views
0

我一直在寻找这个时间过长,看不出是什么问题:混淆gcc的错误信息

#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抱怨:

In function 'main':
Line 17: error: expected identifier before numeric constant

两个预处理后的作业应该是相同的,但显然我错过了一些东西...

您可以在此运行代码:http://codepad.org/0c1aUBLm

回答

2
#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) 
+0

D'哦 - 我知道它是什么简单而明显的,但我无法看到它 - 感谢... –

+2

@PaulR我假设你很累了:)得到一些咖啡/睡觉:) – 2013-04-14 21:38:09

+1

你现在正在 - 脑功能严重枯竭刚才。 ;) –

2

不会F(1, 2)扩大到(v.1 = 1, v.2 = 2, v)

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

应该会更好

+0

是的,它会... – 2013-04-14 21:36:19

+1

谢谢@simonc - H2CO3狭义地殴打你的答案,但反正有投票权。 ..;) –