C预处理器如何去除__align__和__attribute__?

6

我正在使用一个简单的C解析器,它无法处理预处理器指令。

我可以使用-E开关预处理大部分标头而没有问题。

最近我发现了一些存在attributealign的情况。

我尝试用以下方法摆脱它们:

gcc -D "aligned(ARGS)" \
    -D "__align__(ARGS)" \
    -D "__attribute__(ARGS)" \
    -E /usr/local/include/fancyheader.h 

更新:

但是没有成功,例如:

struct __attribute__((aligned(16))) long4
{
  long int x, y, z, w;
};

以上语句被转换为,在“1”周围挂起。
struct 1 long4
{
  long int x, y, z, w;
};

谁知道去掉__align__和__attribute__扩展的正确方法?


2
好的,这个原始的C解析器是什么,你想用它做什么?当你尝试使用-D指令去除这些东西时发生了什么?只是“没有成功”并没有告诉我们任何信息。 - David Thornley
如果您指定 gcc -x c -D .... 会发生什么? - Andy Finkenstadt
3个回答

10

当您使用-D "aligned(ARGS)="时会发生什么?


对我来说可以。除了你需要删除那个引号。 - TonyK
3
默认情况下(如果没有“=”),-D选项将该宏定义为扩展为“1”。 - Chris Dodd
@Chris,酷啊,你记得你在哪里看到的吗?我不记得我曾经见过它。 - fabrizioM
@TonyK:我添加了一个闭引号来防止括号被Shell解释。 - Andy Finkenstadt
@fabrizio:应该在你的C编译器文档中有说明。GCC将其与所有其他预处理选项一起列出。 - Chris Dodd

3

预处理器将在没有指定替换列表的情况下,为所有在命令行上定义的宏分配值1。例如,如果使用-DFOO编译:

std::cout << FOO << std::endl;

将打印1。如果您想明确设置宏替换列表为空,请使用-DFOO=(或在您的情况下使用-D__align__(x)=)。


0

使用-U选项取消定义所有内置和预定义宏,然后使用-D选项创建新的定义,这个怎么样?


我遇到了这个错误:<command-line>:error:宏名称必须是标识符。 - fabrizioM

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