如何设置gcc-E深度(预处理级别)?

如何设置gcc-E深度(预处理级别)?,c,gcc,c-preprocessor,C,Gcc,C Preprocessor,假设我们有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"

假设我们有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(); }; };
如果可能的话,我如何调整扩展深度?

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

你不能——一般情况下不行。宏是通过递归展开的,不能使用GNU
cpp
等设置递归深度

在不同文件中定义了“外部”和“内部”宏的特定情况下,您可以通过不包含(或提供空的包含)定义“外部”定义的文件,并将“内部”定义的文件直接输入cpp,在某种程度上实现所需


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

可能是一个可行的解决方法,只有在允许您更改源代码(即使在这种情况下,在大型项目中也很难应用)的情况下,才可以将适当的
#undef
注入适当的位置,可能是在一些
#ifdef
-
#endif
块中,以便通过命令行轻松激活/禁用(通过
-D
)。但这并不是在所有情况下都有效。
# 1 "main.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "main.c"
# 11 "main.c"
{ f(); f(); };