提问者:小点点

如何知道符号的确切来源


我有个关于include文件的问题。

假设您正在使用来自windows标头的定义。 当然,您可以知道定义宏的确切头是什么。 但问题是我们能否获得include链并知道是哪个路径导致宏被包含?

例如。 我有以下结构

windows.h // a windows header defines a macro

header1.h <- windows.h // a <- b means a includes b
header2.h <- windows.h
header3.h <- windoes.h
header4.h <- header1.h, header2.h
header5.h <- header1.h, header4.h, header3.h

正如您所预期的,实际示例可能会非常复杂,宏定义和ifdefs的音调非常复杂。

现在,在我们的示例.cpp中,我们将#include“header4.h”#include“header5.h”或两者一起使用,然后在代码中使用windows.h中的宏。 如何知道什么是include链?

例如。 对于本例,它可以是header4.h-header1.h-windows.h


共1个答案

匿名用户

在gcc 6.3.0中,您可以使用#pragma技巧

$ cat so62875940.c
#include <stdio.h>
#pragma message "so62875940.c"

int main(void) {
    puts("foo");
    return 0;
}
$ gcc so62875940.c
so62875940.c:2:9: note: #pragma message: so62875940.c
 #pragma message "so62875940.c"
         ^~~~~~~

然后按照包含顺序。。。