预处理后如何查看包含文件的实际顺序?

时间:2011-03-10 11:08:54

标签: c++ gcc include c-preprocessor header-files

我有一个.cpp文件,其中包含一些头文件。这些头文件也可以包括其他头文件。包括防护装置以防止包含相同的文件两次。

知道每个文件只包含一次。有没有办法找出包含所有标题的最终顺序?

我尝试gcc -E来获取预处理器输出,但生成的代码似乎无法用于提取我想要的信息。有人可以帮忙吗?

修改

我问的原因是因为我需要以正确的顺序将我的头文件包含在SWIG接口文件中,以避免产生奇怪的SWIGTYPE_p_ *包装。

更新

感谢您的回答。使用cpp -H似乎非常有用。但是,我无法找到grepsed这些结果的方法,以便以正确的顺序获取头文件的简单列表,而无需重复。

3 个答案:

答案 0 :(得分: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

有关详细信息,请参阅GNU cpp manual

编辑这是一个小的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。)

答案 1 :(得分:5)

预处理器按顺序工作,您可以“轻松”手动完成工作。

说你有:

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。所以订单将是

  1. one.h
  2. three.h
  3. four.h
  4. header.h
  5. two.h
  6. 我不知道你为什么这么问,但我强烈建议你以任何一种非确定性包含顺序的方式编写标题,否则你迟早会遇到一些问题。< / p>

答案 2 :(得分:0)

如果你想让事情变得更加时髦,你可以试着看看http://www.boost.org/doc/libs/release/libs/preprocessor的东西......

从我的头脑中,我认为你应该能够在每个标题内构建一个特殊值,每个标题包含增量。就像我说的那样,看看Boost-stuff可能会给你一些想法。