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

时间:2011-06-26 05:31:40

标签: c++ c include c-preprocessor

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

我尝试通过运行gcc -E仅使用我的项目标题的-I标志而不是库的-I标志来执行此操作,但这不起作用,因为gcc给出遇到#include时出错,无法扩展。

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

5 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

您不想展开的#include,您可以使用$$$include之类的内容替换(简而言之,预处理器无法理解)。首先,您应将原始文件复制到临时文件中,然后运行gcc -E <filename>;。完成后,再次替换原始源文件。

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

答案 2 :(得分:2)

这个怎么样?:

#include <always_include.h>
#include <another_always_include.h>

#ifdef PART_2_INCLUDES
 #include <part2.h>
 #include <part2a.h>
#endif

#ifdef PART_3_INCLUDES
 #include <part3.h>
 #include <part3a.h>
#endif

...

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

#include <always_include.h>
#include <another_always_include.h>

#ifndef PART_2_INCLUDES_OMITTED
 #include <part2.h>
 #include <part2a.h>
#endif
...

答案 3 :(得分:2)

-nostdinc用于gcc(或cpp)。

gcc ... -nostdinc ...

答案 4 :(得分:0)

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

#include <limits.h>

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