部分预处理C或C ++源文件?

有没有办法部分预处理C或C ++源文件? 通过“部分预处理”,我的意思是扩展一些但不是全部的#include指令。 例如,我想扩展#includes指向我的项目头,但#includes指向其他库的头。

我尝试通过运行gcc -E来实现这一点,只有我的项目头的-I标志而不是库的-I标志,但这不起作用,因为gcc在遇到#include时发出错误它无法扩展。

编辑 :我并不关心预处理器在宏扩展方面的行为。

C预处理器不够智能,无法自行完成。 如果您只对#include感兴趣,那么您应该使用自己的工具(例如Perl)来处理源文件,扩展您感兴趣的#include行并忽略其余部分。

此脚本使用// Ignored前缀不感兴趣的标题行:

 #!/usr/bin/perl use warnings; use strict; my @uninteresting = qw(iostream vector map); my $uninteresting = join '|', @uninteresting; while (<>) { s%(#include <(?:$uninteresting)>)%// Ignored $1%; print; } 

现在你可以这样做:

 cat sourcefile.cpp | perl ignore-meh.pl | g++ -E 

如果你想得到真正的幻想:

 #!/usr/bin/perl use warnings; use strict; while (<>) { s%// Ignored (#include <[^>]+>)%$1%; print; } 

现在你可以这样做:

 cat sourcefile.cpp | perl ignore-meh.pl | g++ -E | perl restore-meh.pl 

#include你不想扩展,你可以用$$$include替换(简而言之,预处理器无法理解)。 首先将原始文件复制到临时文件中,然后运行gcc -E ; 。 完成后,再次替换为原始源文件。

这里唯一的问题是你必须至少编辑一次源文件。 但这可能不是什么大问题,因为您可以使用文本编辑器提供的工具。

这个怎么样?:

 #include  #include  #ifdef PART_2_INCLUDES #include  #include  #endif #ifdef PART_3_INCLUDES #include  #include  #endif ... 

然后,为了编译所有内容, gcc -DPART_2_INCLUDES -DPART_2_INCLUDES ...或者,因为看起来通常一切都应该包含在默认情况下并且不包括某些项目是特殊情况,反转测试的意义:

 #include  #include  #ifndef PART_2_INCLUDES_OMITTED #include  #include  #endif ... 

使用-nostdinc表示gcc (或cpp )。

 gcc ... -nostdinc ... 

在一般情况下,部分标题扩展是没有意义的。 请考虑以下示例:

 #include  #if UINT_MAX > 0xffffffff # include "fasthash_64.h" #elif UINT_MAX == 0xffffffff # include "hash.h" #else # error "int too small for hash implementation." #endif