#define woes - 不是的宏

时间:2011-07-15 17:02:48

标签: c-preprocessor

我正在尝试做类似的事情:

#define __attribute__((aligned(2))) __attribute__((space(prog),aligned(2)))

但编译器产生:

 error: "(" may not appear in macro parameter list

问题:什么给出了什么?我怎样才能做文字文字替换,没有铃声,没有多余的装饰?

2 个答案:

答案 0 :(得分:5)

一旦从括号开始,你就是用参数定义一个宏,并且这个宏绑定了一些规则。

所以你可以做,例如:

#define succ(x) (x + 1)

但你不能这样做:

#define pred(x + 1) x

预处理器只进行一组非常有限的模式匹配。

可以做的事情是这样的:

#define __aligned2__ __attribute__((space(prog),aligned(2)))

然后使用那个定义。如果这不足以满足您的需求,则需要使用sed进行一些自定义预处理。

答案 1 :(得分:4)

使用C预处理器无法做到这一点。如果您要替换的文本是单个标识符(C标准用语中的“类对象宏”),则只能定义“文字txt替换”。您编写的内容会导致预处理器认为您正在尝试使用名为“(aligned(2))”的参数来定义“类似函数的宏”,这是一种语法错误。

我会通过将整个__attribute__构造包装在类似对象的宏中来处理这个问题:

#if appropriate condition
#define ATTRIBUTE_ALIGNED_2 __attribute__((space(prog),aligned(2)))
#else
#define ATTRIBUTE_ALIGNED_2 __attribute__((aligned(2)))
#endif

然后在整个源代码中将__attribute__((aligned(2)))替换为ATTRIBUTE_ALIGNED_2