C宏给出编译时错误

时间:2013-05-02 20:09:06

标签: c macros c-preprocessor

我想用宏来扩展一个功能。所以我写了下面的代码:

#define INIT ( T ) \
    struct T * init##T() { \
    struct T * obj  = ( struct T *)malloc( sizeof (struct T )); \
    return obj; \
} \

我使用以下内容调用宏:

INIT (mystruct);

错误::

  

错误:在'struct'之前预期'=',',',';','asm'或'__attribute__'       警告:数据定义没有类型或存储类[默认情况下启用]

我想基本上编写接受任何结构的通用宏,为该结构的对象分配空间并返回相同的值。

1 个答案:

答案 0 :(得分:7)

6.10(1)中类似函数宏定义的语法是:

  

# define 标识符lparen标识符列表 opt replacement-list new-line

     

lparen: a(字符不会立即以空格开头

宏定义中的宏名称和左括号之间不能有空格(但在宏调用中它们之间可能有空格)。

因此,您不定义类似函数的宏,而是定义类似对象的宏,扩展为

( T ) struct T * ...

删除空格:

#define INIT( T ) \
    struct T * init##T() { \
    struct T * obj  = ( struct T *)malloc( sizeof (struct T )); \
    return obj; \
}

它会起作用。