假设我们有 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 - 但这至少表明您想要的东西在技术上是可能的。
关于c - 如何设置gcc -E深度(预处理级别)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41762048/