4

是否可以以编程方式检测(并打印出)包含 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."

编辑:要清楚我为什么要这样做:编译器抛出的警告已经有很大帮助:代码没有损坏,但会促使人们更改包含。问题:它可能会责怪错误的“家伙”,因为您可以通过另一个标题拉入此标题。我的目标是责怪错误的标题,而不是编译单元。

4

3 回答 3

2

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

于 2012-11-22T09:55:34.897 回答
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"
于 2012-11-23T12:39:45.347 回答
0

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

于 2012-11-22T09:58:22.413 回答