【问题标题】:How to set gcc -E depth (preprocessing level)?如何设置 gcc -E 深度(预处理级别)?
【发布时间】:2017-01-20 11:00:35
【问题描述】:

假设我们有 main.c:

#define f() { \
    foo();    \
    bar();    \
}

#define F() { \
    f();      \
    f();      \
}

F();

现在如果我们gcc -E main.c -o main.i,在 main.i 中有:

# 1 "main.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "main.c"
# 11 "main.c"
{ { foo(); bar(); }; { foo(); bar(); }; };

如果我不想扩展内部宏(如f())怎么办。我怎样才能得到类似的东西:

# 1 "main.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "main.c"
# 11 "main.c"
{ f(); f(); };

如果可能的话,我该如何调整扩展深度?

【问题讨论】:

  • 也许一个可能的解决方法,只有当你被允许更改源代码(即使在这种情况下,它仍然难以应用于大型项目),将注入正确的@987654326 @ 在合适的位置,可能在一些#ifdef-#endif 块中,以便通过命令行轻松激活/停用(通过-D)。不过,这仍然不是在所有情况下都有效。

标签: c gcc c-preprocessor


【解决方案1】:

简单的答案(至少对于我知道的 C 预处理器):

你不能——一般情况下不能。宏通过递归扩展,递归深度无法设置,例如 GNU cpp

在“外部”和“内部”宏定义在不同文件中的特定情况下,您可以在某种程度上通过简单地不包含(或提供一个空的包含) 定义“外部”定义并将带有“内部”定义的文件直接输入 cpp 的文件。

然而,我确实有一个嵌入式系统的 cpp 实现,当以最高详细度 (“-vvv”) 执行时,它实际上确实打印到标准错误的每个递归步骤,尽管这并没有帮助您使用 gcc/cpp - 但这至少表明您想要的东西在技术上是可行的。

【讨论】:

    猜你喜欢
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    • 1970-01-01
    • 2011-02-06
    • 2018-06-03
    • 2020-07-21
    相关资源
    最近更新 更多