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

标签 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(); };

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

最佳答案

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

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

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

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

关于c - 如何设置gcc -E深度(预处理级别)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41762048/

相关文章:

c - 如何调试 "INT_MAX undeclared"

ios - 在 Nib 文件中使用常量

c++ - 我可以制作一个宏来执行调试或发布代码吗?

c - float 精度更高,有可能吗?

c - 如何使用包含线程的个人库编译 C 程序

c - 如何禁用此特定警告

c - 使用 mingw 的 gcc,SDL : "undefined reference to ` SDL_Init'"What does the error message mean and how do I resolve it?

c++ - Windows 客户端服务器应用程序中的 CreateProcess()

c - 编码(marshal)处理/解封处理与序列化/反序列化之间有什么区别?

我可以让编译器优化结构中的函数调用吗?