假设我们有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(); };
另外,如果可能的话,我该如何调整扩展深度?
简单的答案(至少对于我知道的 C 预处理器):
你不能 - 不是在一般情况下。宏通过递归扩展,并且不能使用 GNU cpp
等 .
在特定情况下,"外部"和"内部"宏在不同的文件中定义,您可以通过简单地不包含(或提供空包含)定义"外部"定义的文件并将带有"内部"定义的文件直接输入到 cpp 中来实现您想要的。
但是,我确实有一个嵌入式系统的cpp实现,当以最高详细程度("-vvv")执行时,它实际上确实将每个递归步骤打印到stderr,尽管这对gcc/cpp没有帮助 - 但这至少表明你想要的东西在技术上是可行的。