【问题标题】:C Preprocessor getting rid of the __align__ and __attribute__C 预处理器摆脱了 __align__ 和 __attribute__
【发布时间】:2011-04-21 15:44:44
【问题描述】:

我正在使用不处理预处理器指令的原始 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__ 扩展的正确方法?

【问题讨论】:

  • 好的,这个原始的 C 解析器是什么,你想用它做什么?当你试图用 -D 指令摆脱这些东西时发生了什么?只是“没有成功”告诉我们什么。
  • 如果指定gcc -x c -D .... 会发生什么?

标签: c gcc optimization c-preprocessor


【解决方案1】:

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

【讨论】:

  • 这对我有用。除非您需要删除该引号。
  • 默认情况下(如果没有=),-D 选项将宏定义为扩展为1
  • @Chris 很酷,你还记得你在哪里读到的吗?我不记得看过它
  • @TonyK:我添加了一个右引号来防止括号的 shell 解释。
  • @fabrizio: 应该在 C 编译器的文档中。 Gcc 将它与所有其他预处理器选项一起列出。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我得到这个错误::错误:宏名称必须是标识符
    猜你喜欢
    • 2011-07-18
    • 1970-01-01
    • 2016-06-30
    • 2013-01-09
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 2011-07-02
    相关资源
    最近更新 更多