有没有办法部分预处理 C 或C ++源文件?通过“部分预处理”,我的意思是扩展一些但不是全部的#include指令。例如,我想扩展#includes指向我的项目标题,但不是#includes指向其他库的标题。
我尝试通过运行gcc -E
仅使用我的项目标题的-I
标志而不是库的-I
标志来执行此操作,但这不起作用,因为gcc给出遇到#include时出错,无法扩展。
编辑:我并不关心预处理器在宏扩展方面的行为。
答案 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)
答案 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