C语言 如何判断头文件是从哪里包含的?

unhi4e5o  于 2023-05-16  发布在  其他
关注(0)|答案(6)|浏览(191)

我怎么知道g++在哪里可以找到一个包含文件?基本上如果我

#include <foo.h>

g将扫描搜索路径,使用任何包含选项来添加或更改路径。但是,在最后,有没有一种方法可以告诉我g选择编译的foo.h的绝对路径?如果在无数的搜索路径中有不止一个foo.h,这一点尤其重要。
如果没有办法做到这一点...有没有办法让g++告诉我,在包含默认值和所有包含选项之后,它的最终搜索路径是什么?

xcitsw88

xcitsw881#

g++ -H ...

我也将打印包含文件的完整路径,格式显示哪个头包含哪个

gmxoilav

gmxoilav2#

这将给予make依赖项,列出include文件的绝对路径:

gcc  -M showtime.c

如果您不希望系统包含(即#include <something.h>)然后用途:

gcc  -MM showtime.c
kkih6yb8

kkih6yb83#

当然用

g++ -E -dI  ... (whatever the original command arguments were)
4dbbbstv

4dbbbstv4#

如果您的构建过程非常复杂…

constexpr static auto iWillBreak = 
#include "where/the/heck/is/this/file.h"

这将(几乎肯定)导致在文件顶部附近出现编译错误。这应该会显示一个编译器错误,并显示编译器看到的路径。
显然,这比其他答案更糟糕,但有时这种黑客是有用的。

aemubtdh

aemubtdh5#

如果使用-MM或相关选项之一(-M等),则只会获得包含的头文件列表,而不会获得所有其他预处理器输出(您似乎可以使用建议的g++ -E -dI解决方案获得)。
您也可以使用-H选项。它打印标题,因为它们包含一个点.作为标题中每个嵌套级别的前缀。你直接包含的内容前面加了一个点和一个空格;这些文件包含的文件的前缀是两个点和一个空格,等等。这可能会有帮助。输出显示在stderr而不是stdout上。(另请参阅answer,它建议使用-H,但不包括有关输出格式的信息。

jc3wubiy

jc3wubiy6#

对于MSVC,您可以使用/showInclude选项,该选项将显示包含的文件。

  • (这是在Michael Burr对this answer的评论中陈述的,但我想让它更明显,因此将其作为单独的答案添加。

可用性注解:编译器会将此信息发送到标准错误输出,在使用windows命令提示符时,默认情况下该输出似乎被抑制。使用2>&1将stderr重定向到stdout以查看它。

相关问题