我正在尝试在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
替换。
所以这是我的问题,我如何编写我的宏才能...使用它?
提前谢谢
答案 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。