#define烦恼——一个不起作用的宏定义

3

我想要做这样的事情:

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

但编译器给出的结果是:
 error: "(" may not appear in macro parameter list

问题:怎样进行字面文本替换,不要有任何修饰或附加条件?


1
你是否缺少一个闭合括号?#define __attribute__((aligned(2))) __attribute__((space(prog),aligned(2))) - Benjamin Bannier
谢谢您的评论,但不好意思,即使没有那个错误,编译器仍然会出现相同的错误。 - overscore
你的括号不匹配。 - jok3rnaut
这与嵌套有关 ((( 我认为 - overscore
由于楼主似乎没有足够的声望来编辑他们的问题,我已经为他们添加了缺失的括号。 - zwol
我认为@honk是正确的。如果没有括号,你就会产生递归定义(attribute__被要求来定义 attribute__)。 - ixe013
2个回答

5
一旦您使用括号开始,就定义了一个带有参数的宏,并且受到一些规则的限制。
因此,您可以执行以下操作:
#define succ(x) (x + 1)

但你不能做到:

#define pred(x + 1) x

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

相反,您可以尝试以下方法:

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

使用该定义即可。如果您的需求不足,您需要使用 sed 进行一些自定义预处理。


4
这在C预处理器中是不可能的。只有当你想替换的文本是单个标识符(C标准术语中的“对象式宏”)时,你才能定义“字面文本替换”,正如你所述。你所写的代码会导致预处理器认为你试图定义一个“函数式宏”,其中有一个名为“(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


1
哈!看我如何解决它:#define attribute(x) attribute((space(prog),aligned(2))) - overscore
只要没有人想使用GCC的其他属性扩展,这个方法就可以工作,但是第一次有人在函数上放置__attribute__((noreturn)),就会出现问题。 - zwol
定义不仅仅适用于此文件的作用域吗? - overscore
如果您将其放在一个源文件中,是的 - 但那么为什么不只是修复该文件中的用法呢? 如果它在头文件中,则包括该头文件的所有内容都会得到它。 您似乎正在尝试进行整个项目的调整。 - zwol
1
很好。问题在于我正在尝试修复一个由可执行二进制文件生成的源文件,所以...是的,我更喜欢花一些时间开发定义来自动修复生成的.c文件,而不是每次都进行查找->替换。 - overscore
啊,我懂了。你的方法还可以,但你有没有考虑添加一个构建步骤来编辑生成的.c文件呢?使用sed、Perl或其他方便的工具。这样比C预处理器让你做的更加灵活。 - zwol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接