是否可以通过编程方式检测(并打印出)包含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."
编辑:要清楚我为什么要这样:编译器抛出的警告已经帮助了很多:代码没有被破坏但是却引发了人们改变包含。问题:它可能会责怪错误的'家伙',因为你可以通过另一个标题来引入这个标题。我的目标是责怪错误的标题,而不是编译单元。
答案 0 :(得分:2)
您可以使用选项运行编译器以生成预处理的源代码,而不是完全编译的(gcc -E
,CL.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
预处理程序指令放入错误的头文件中。在编译期间,它将发出警告,该警告将通知您想要的任何内容。