如何在不展开包含的头文件的情况下预编译C源文件?

3

我正在使用C编程语言开发一个大型项目,其中有很多预处理宏:#ifdef/#if。这些宏在makefile中定义。

为了让代码更简洁,我修改了makefile文件使用"gcc -E"进行预处理。但是gcc预处理器也会将包含的头文件展开,而我并不希望这样。

有没有办法在不展开包含的头文件的情况下去除 #ifdef/#if?我查找了GCC选项,但还没有找到答案。

以下是一个示例:

    #include "a.h"
    #ifdef ABC
    func()
    #else
    func(a)
    #endif
    {
    ...
    }

在makefile中,这个源码是使用-DABC编译的,我正在寻找一种方法将文件更改为:
    #include "a.h"
    func()
    {
    ...
    }

1
  1. 我不明白这有什么用处。
  2. 如果你真的需要这个,那么为什么不单独创建一个带有定义的头文件,而不包含任何头文件,并将此辅助头文件包含在其他头文件中呢?
- user529758
1
你可以在包含的头文件周围放置#ifndef _OMIT_HEADERS_#endif,然后使用gcc -E -D_OMIT_HEADERS_吗? - steabert
最初的目的是收集项目的一些源代码指标,例如圆周复杂度。像CCCC这样的计算工具无法识别预处理宏。 - Jason Ye
谢谢!unifdef正是我要找的! - Jason Ye
显示剩余3条评论
1个回答

2

如果您只想从代码中删除预处理条件,可以使用 unifdef

unifdef -DFOO header.h

1
我尝试了sunifdef,它运行良好。嗯,代码可以变得更加清晰。谢谢! - Jason Ye

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接