在我定义的.h文件中:
#define PAIR_TYPE(type1, type2)\
typedef struct { \ // added \ after edit
type1 first; \ // added \ after edit
type2 second; \ // added \ after edit
}; // added ; after edit
#define MAKE_PAIR(val1, val2) {val1, val2}
PAIR_TYPE(char *, uint32_t) mypair;
mypair foo();
在.c文件中,我这样使用它:
mypair foo()
{
mypair p;
uint32_t bar = calculate();
p = MAKE_PAIR("normal", target);
return p;
}
但是我收到了这个错误:
错误:'{'标记
之前的预期表达式
它指出的一行是:
p = MAKE_PAIR("normal", target);
我不知道为什么会说'{'!!!那条线上没有'{'。
答案 0 :(得分:7)
'{'
后,你需要更多的反斜杠#define PAIR_TYPE(type1, type2)\
typedef struct {\
type1 first;\
type2 second;\
}
答案 1 :(得分:3)
是的!但它被预处理器的魔法隐藏在你的眼前。请记住,the preprocessor is evil,你肯定会过度使用它。
预处理器只进行文本替换,因此编译器看到的代码实际上是:
p = {"normal", target};
这不是有效的C语法。在那里,看看'{'。 该语法仅在初始化时有效,而不在赋值中有效:
mypair a = {"a", 1}; /* ok */
a = {"a", 1}; /* error */
答案 2 :(得分:0)
在PAIR_TYPE
宏中,您需要删除末尾的分号,以便为类型指定的名称是typedef的一部分。现在,当你这样做:
PAIR_TYPE(char *, uint32_t) mypair;
..你得到:
typedef struct {
char * first;
uint32_t second;
}; mypair;
.. }
和mypair
之间有一个分号,不应该在那里。
您还需要使用MAKE_PAIR宏的强制转换按照您使用它的方式工作。现在,行:
p = MAKE_PAIR("normal", target);
..扩展为:
p = {"normal", target};
..哪个不行。但是如果你添加一个演员:
p = (mypair)MAKE_PAIR("normal", target);
..然后扩展的行是:
p = (mypair){"normal", target};
..这可以工作,因为类型转换告诉编译器{
和}
之间的字段应该是什么。虽然请注意,您要将第一个字段中的char *
设置为指向文字"normal"
,而不是复制字符串。
答案 3 :(得分:0)
如果您使用c idiom来编写宏,如链接中所示,您将不会遇到问题。有关详细信息,请参阅http://c-faq.com/cpp/multistmt.html。