2011-04-21 16 views
6

我正在使用原语C解析器不处理预处理器指令。C预处理程序正在删除__align__和__attribute__

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

最近我发现案例属性对齐是否存在。

我就先用这个调整摆脱他们:

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指令去掉那些东西?只是“没有成功”告诉我们什么都没有。 – 2011-04-21 15:56:57

+0

如果你指定'gcc -xc -D ....',会发生什么? – 2011-04-21 16:03:16

回答

10

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

+0

这对我很有用。除了你需要删除引用标记 – TonyK 2011-04-21 16:08:42

+0

这是行得通的。但为什么需要=? – fabrizioM 2011-04-21 16:10:45

+3

默认情况下(如果没有'='),-D选项定义宏扩展为'1' – 2011-04-21 16:16:29

0

如何使用-U选项取消定义所有内置宏和预定义宏,然后使用-D选项创建新定义?

+0

我得到这个错误::错误:宏名称必须是标识符 – fabrizioM 2011-04-21 16:14:52

3

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

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

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