我正在尝试做类似的事情:
#define __attribute__((aligned(2))) __attribute__((space(prog),aligned(2)))
但编译器产生:
error: "(" may not appear in macro parameter list
问题:什么给出了什么?我怎样才能做文字文字替换,没有铃声,没有多余的装饰?
答案 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
。