带参数的通用多线宏

时间:2015-09-24 22:03:15

标签: c macros

我正在尝试在C中实现一个通用堆栈,借助一个大宏(不是最好的方法,但这不是重点)。 这个宏包含函数声明,结构和函数调用,TYPE类型将被所需的替换:

#define STACK(TYPE)                                                          \
(                                                                            \
    struct stack                                                             \
    {                                                                        \
        size_t           size;                                               \
        struct container *top;                                               \
    };                                                                       \
                                                                             \
    struct container                                                         \
    {                                                                        \
        TYPE             data;                                               \
        struct container *next;                                              \
    };                                                                       \
                                                                             \
    struct stack *stack_init(void)                                           \
    {                                                                        \
        struct stack *s = malloc(sizeof (struct stack));                     \
        if (!s)                                                              \
            return NULL;                                                     \
        return s;                                                            \
    }                                                                        \
    ... ...
)

此头文件将在任何带有此行的.c文件中调用

#include "utils_stack.h"
STACK(int)

事实上,在尝试了gcc告诉我尝试的每种可能形式的语法之后,我找不到让它工作的方法。我尝试用括号,括号,两者,没有...... 代码根本不起作用。以下是我使用上述语法获得的错误: error: expected identifier or ‘(’ before ‘struct’

尝试使用-E标志运行gcc时,我清楚地看到TYPE正被int替换。

所以这是我的问题,我如何编写我的宏才能...使用它?

提前谢谢

1 个答案:

答案 0 :(得分:1)

正如评论中所提到的,这应该有效,只需删除括号:

#include <stdio.h>
#include <malloc.h>

#define STACK(TYPE)                                                          \
    struct stack                                                             \
    {                                                                        \
        size_t           size;                                               \
        struct container *top;                                               \
    };                                                                       \
                                                                             \
    struct container                                                         \
    {                                                                        \
        TYPE             data;                                               \
        struct container *next;                                              \
    };                                                                       \
                                                                             \
    struct stack *stack_init(void)                                           \
    {                                                                        \
        struct stack *s = malloc(sizeof (struct stack));                     \
        if (!s)                                                              \
            return NULL;                                                     \
        return s;                                                            \
    }                                                                        \


STACK(int)

int main()
{
    struct stack *s;
    s = stack_init();
    // ...
}

如果您定义类似函数的宏,请使用括号,例如:

 #define maxint(a,b) \
   ({int _a = (a), _b = (b); _a > _b ? _a : _b; })

有关详细信息,请参阅gcc statement expresions