GCC 使用 -D 参数定义类似函数的宏

Posted

技术标签:

【中文标题】GCC 使用 -D 参数定义类似函数的宏【英文标题】:GCC define function-like macros using -D argument 【发布时间】:2015-10-29 16:59:19 【问题描述】:

问题

我正在尝试从 C 代码中删除 __attribute__,然后再将其发送到解析器。有没有办法使用-D 参数定义类似函数的宏?

使用头文件的解决方案

#define __attribute__(x)

尝试的解决方案

gcc -E -D__attribute__(x)= testfile.c
gcc -E -D__attribute__(x) testfile.c

【问题讨论】:

你试过gcc -E -D'__attribute__(x)' testfile.c 吗?您的 shell 可能会在将参数发送到 gcc 之前解释括号。 @NiBZ 对不起,不担心。回来说“宏名必须是标识符” 奇怪,它对我有用(Ubuntu 14.04)...(有关我测试的内容,请参阅 gist.github.com/N-Bz/dff2706c2ccec97d9542)。如果头文件解决方案有效,那么gcc-include 选项(强制包含头文件)可能会对您有所帮助。 gcc -E -D__attribute__(x)= testfile.c 适用于 Windows。 【参考方案1】:

来自手册页

       If you wish to define a function-like macro on the command line,
       write its argument list with surrounding parentheses before the
       equals sign (if any).  Parentheses are meaningful to most shells,
       so you will need to quote the option.  With sh and csh,
       -D'name(args...)=definition' works.

所以这适用于 Unix/Linux shell

gcc -D'__attribute__(x)='

在 Windows CMD 上,原始表达式有效,因为括号并不特殊:

gcc -D__attribute__(x)=

【讨论】:

是的,在我之前的评论中忘记了=。需要=,因为-Dsomething 充当#define something 1,而不是#define something 如果你必须将它作为 CFLAGS=... 参数传递给 Makefile,不要忘记引用两次,例如使用CFLAGS='"-D__attribute__(x)="'(这里我在单引号中使用了双引号,以避免使用\ 转义)。

以上是关于GCC 使用 -D 参数定义类似函数的宏的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 gcc 显示预处理的宏(只是用户定义的)?

12_关于flask中的宏

定义名称基于宏参数的函数的宏

gcc参数记录

gcc参数记录

是否可以在同一个字符序列上有一个类似函数的宏和一个类似对象的宏?