Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检测头从何处包括 是否有可能从()C++中检测到C++头包含在哪里?_C++_C - Fatal编程技术网

如何检测头从何处包括 是否有可能从()C++中检测到C++头包含在哪里?

如何检测头从何处包括 是否有可能从()C++中检测到C++头包含在哪里?,c++,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 Dep

我有这样一个标题:

// 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."

编辑:为了弄清楚我为什么要这样做:编译器抛出的警告已经起到了很大的作用:代码没有被破坏,但会戳破人们来更改包含。问题:它可能会责怪错误的“家伙”,因为你可以通过另一个头球拉进这个头球。我的目的是责备错误的头,而不是编译单元。

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

不确定确切的解决方案(可能是使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>和其他类似宏),但您可以尝试将<。在编译过程中,它将发出警告,通知您想要的任何信息。

尽管我认为不值得使用此功能,但这里有一个解决方案

在每个头文件的顶部,在检查不推荐使用的头文件之后,在包含其他文件之前,放置以下内容:

#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"

通过对代码库进行简单的文本搜索难道不可能做到这一点吗?在生成文件之前运行脚本将是最简单的一个词:
/showcludes
。一个快速的解决方案是删除该文件并查看编译器生成的include错误。“以编程方式”通过相关应用程序之外的方式(在构建过程中包含include)或任何其他程序/工具?这不完全是我要找的-请参阅问题中的注释。在我考虑一个预编译脚本之前,我会把它原封不动——警告已经“大声”了,但是可以责备错误的人。文件指的是当前的文件,我希望有一个东西指向“以前的文件”。这个警告正是我所做的。谢谢,我也想过类似的事情,但这听起来太费劲了。我认为像现在这样的警告是可行的最大限度的警告。无论如何,谢谢你的解决方案@波夫,我也认为这不值得这么麻烦,更不用说非常不传统了。别忘了向上投票/接受帮助你/回答你问题的帖子。我试过了,但结果是“向上投票需要15个声誉”