Sta*_*ked 7 c++ gcc include header-files c-preprocessor
我有一个.cpp文件,其中包含一些头文件.这些头文件也可以包括其他头文件.包括防护装置以防止包含相同的文件两次.
知道每个文件只包含一次.有没有办法找出包含所有标题的最终顺序?
我试图gcc -E获得预处理器输出,但生成的代码似乎不可用于提取我想要的信息.有人可以帮忙吗?
我问的原因是因为我需要以正确的顺序将我的头文件包含在SWIG接口文件中,以避免生成奇怪的SWIGTYPE_p_*包装器.
谢谢你的回答.使用cpp -H似乎非常有用.但是,我无法找到方法grep或sed这些结果,以便以正确的顺序获得头文件的简单列表,而无需重复.
Fre*_*Foo 14
使用cpp -H.这会打印用于标准错误的标头.例:
$ cpp -H -I../../include base64.cpp 2>&1 >/dev/null | head
. /usr/include/c++/4.4/cstring
.. /usr/include/c++/4.4/i486-linux-gnu/bits/c++config.h
... /usr/include/c++/4.4/i486-linux-gnu/bits/os_defines.h
.... /usr/include/features.h
..... /usr/include/bits/predefs.h
..... /usr/include/sys/cdefs.h
...... /usr/include/bits/wordsize.h
..... /usr/include/gnu/stubs.h
...... /usr/include/bits/wordsize.h
...... /usr/include/gnu/stubs-32.h
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅GNU cpp手册.
编辑这是一个小的Python脚本,它将显示包含的顺序,假设所有标题都包含警戒:
import sys
seen = set()
for ln in sys.stdin:
dots, header = ln.rstrip().split(' ', 1)
if x not in seen:
seen.add(header)
print header
Run Code Online (Sandbox Code Playgroud)
(如果Python不是你的一杯茶,你应该可以将它翻译成Awk或Perl.)
预处理器按顺序工作,您可以"轻松"手动完成工作.
说你有:
file.cpp
#include 'one.h'
#include 'two.h'
Run Code Online (Sandbox Code Playgroud)
one.h
#include 'three.h'
#include 'header.h'
Run Code Online (Sandbox Code Playgroud)
three.h
#include 'four.h'
Run Code Online (Sandbox Code Playgroud)
预处理器将包含one.h,其中包括three.h,其中包括four.h. 现在我们返回到one.h并且将包含header.h,最后我们返回到file.cpp,并且将包含two.h.所以订单将是
我不知道你为什么这么问,但我强烈建议你以任何一种非确定性包含顺序的方式编写标题,否则你迟早会遇到一些问题.