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

时间:2017-01-20 11:00:35

标签: 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"
{ { foo(); bar(); }; { foo(); bar(); }; };

如果我不希望扩展内部宏(如f()),该怎么办?我怎样才能得到类似的东西:

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

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

1 个答案:

答案 0 :(得分:2)

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

你不能 - 不是一般情况下。通过递归扩展宏,并且不能使用例如GNU cpp设置递归深度。

在特定情况下,“外部”和“内部”宏在不同的文件中定义,您可以稍微实现您想要的只是不包括(或提供一个空的包含)定义“外部”定义并将带有“内部”定义的文件直接送入cpp。

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