在C中返回一个typedef

时间:2011-09-28 14:10:58

标签: c return typedef

在我定义的.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);

我不知道为什么会说'{'!!!那条线上没有'{'。

4 个答案:

答案 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