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

Posted

技术标签:

【中文标题】如何在不扩展包含的头文件的情况下预编译 C 源文件?【英文标题】:How to pre-compile a C source file without expand the included header file? 【发布时间】:2013-04-24 04:34:33 【问题描述】:

我正在使用 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.我看不出这有什么用。 2.如果你真的需要这个,那么你不只是用定义制作一个单独的头文件,不包含任何头文件,然后将这个辅助头文件包含在另一个头文件中吗? 我认为large project这一点让事情变得困难 是的,这个项目的文件太多,无法进行这种更改。 你可以在包含的头文件周围加上#ifndef _OMIT_HEADERS_,#endif,然后使用gcc -E -D_OMIT_HEADERS_? 这样做的最初目的是收集项目的一些源代码指标,比如圈复杂度。 CCCC等计算工具无法识别预处理宏。 【参考方案1】:

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

unifdef -DFOO header.h

【讨论】:

我试过 sunifdef ,它工作正常。好吧,代码可以变得更简洁。谢谢!

以上是关于如何在不扩展包含的头文件的情况下预编译 C 源文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不关闭预编译头文件的情况下修复 C1010 错误?

使用预编译头提高编译速度

C 头文件

为啥我在写C语言的头文件,编译时会出现重新定义变量的情况?

23.头文件

C语言基础:头文件