如何检测包含标头的位置

时间:2012-11-22 09:48:57

标签: c++ c

是否可以通过编程方式检测(并打印出)包含C ++标头的位置?

我的标题如下:

// DeprecatedHeader.h
__pragma( message ("DeprecatedHeader.h is deprecated - include NewHeader.h instead.") )
#include "NewHeader.h"

如您所见,编译器是MSVC,但我有要包装的宏。 GCC是受欢迎的,但如果不可能,我会在Windows上启用“技巧”。

但我正在寻找的是像

这样的输出
"AnyOtherFile.cpp was including DeprecatedHeader.h, please include NewHeader.h instead."

编辑:要清楚我为什么要这样:编译器抛出的警告已经帮助了很多:代码没有被破坏但是却引发了人们改变包含。问题:它可能会责怪错误的'家伙',因为你可以通过另一个标题来引入这个标题。我的目标是责怪错误的标题,而不是编译单元。

3 个答案:

答案 0 :(得分:2)

您可以使用选项运行编译器以生成预处理的源代码,而不是完全编译的(gcc -ECL.EXE /E或其他)。生成的代码将包括标记每个代码片段的来源。

答案 1 :(得分:1)

尽管我认为不值得追求这一功能,但这是一个解决方案。

在每个头文件的顶部,在检查不推荐的标头之后和包含其他文件之前,请输入:

#undef INCLUDING_FILE
#define INCLUDING_FILE "file_name.h"

这可以通过一个简单的bash脚本完成,其中为您编写的每个.h文件,包括字符串中的文件名。

所以你的标题看起来像这样(用gcc):

正常标题:

#undef INCLUDING_FILE
#define INCLUDING_FILE "normal.h"

#include "deprecated.h"

弃用标头:

#ifdef INCLUDING_FILE
# pragma message "Internal bug: " INCLUDING_FILE " included " __FILE__ " which is deprecated"
#else
# pragma message "Note: you shouldn't included " __FILE__ " which is deprecated"
#endif

#undef INCLUDING_FILE
#define INCLUDING_FILE "normal.h"

#include "others.h"

答案 2 :(得分:0)

不确定是否有确切的解决方案(可能可以使用__FILE__和其他类似的宏),但您可以尝试将#warning预处理程序指令放入错误的头文件中。在编译期间,它将发出警告,该警告将通知您想要的任何内容。