[英]How to see the actual order of include files after preprocessing?
我有一个.cpp文件,其中包含一些头文件。 这些头文件也可以包括其他头文件。 包括防护装置以防止包含相同的文件两次。
知道每个文件只包含一次。 有没有办法找出包含所有标题的最终顺序?
我尝试使用gcc -E
来获取预处理器输出,但生成的代码似乎无法用于提取我想要的信息。 有人可以帮忙吗?
我问的原因是因为我需要以正确的顺序将我的头文件包含在SWIG接口文件中,以避免生成奇怪的SWIGTYPE_p_ *包装器。
谢谢你的回答。 使用cpp -H
似乎非常有用。 但是,我找不到grep
或sed
这些结果的方法,以便以正确的顺序获得头文件的简单列表,而没有重复。
使用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
有关详细信息,请参阅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
(如果Python不是你的一杯茶,你应该能够把它翻译成Awk或Perl。)
预处理器按顺序工作,您可以“轻松”手动完成工作。
说你有:
file.cpp
#include 'one.h'
#include 'two.h'
one.h
#include 'three.h'
#include 'header.h'
three.h
#include 'four.h'
预处理器将包含one.h,其中包括three.h,其中包括four.h. 现在我们返回到one.h并且将包含header.h,最后我们返回到file.cpp,并且将包含two.h。 所以订单将是
我不知道你为什么这么问,但我强烈建议你以任何一种非确定性包含顺序的方式编写标题,否则你迟早会遇到一些问题。
如果你想让事情变得更加时髦,你可以试着看一下http://www.boost.org/doc/libs/release/libs/preprocessor的东西......
从我的头脑中,我认为你应该能够在每个标题内构建一个特殊值,每个标题包含增量。 就像我说的那样,看看Boost-stuff可能会给你一些想法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.