C++ 可能会因为未包含头文件目录而收到警告或错误

C++ 可能会因为未包含头文件目录而收到警告或错误,c++,visual-studio,include,C++,Visual Studio,Include,我想避免这种情况: h1.hpp: #include <vector> //some code #include "h1.hpp" //#include <vector> This include is commented. int main(){ std::vector<int> x; //works fine! } #包括 //一些代码 main.cpp: #include <vector> //some code #inc

我想避免这种情况:

h1.hpp:

#include <vector>
//some code
#include "h1.hpp"
//#include <vector>  This include is commented.
int main(){
     std::vector<int> x; //works fine!
}
#包括
//一些代码
main.cpp:

#include <vector>
//some code
#include "h1.hpp"
//#include <vector>  This include is commented.
int main(){
     std::vector<int> x; //works fine!
}
#包括“h1.hpp”
//#包含此包含已注释。
int main(){
std::vector x;//工作正常!
}
我想得到一个错误/警告,我正在使用
,但它没有直接包含在MSV中。

如果
用作实现细节(即函数体),则将h1.hpp与h1_head.hpp(声明)和h1_body.hpp(定义)分开。如果您有结构/类,则可以隐藏详细信息,例如在类中声明
detail
struct/class,并仅在h1_body.hpp中定义它。在main.cpp中的代码之前包含h1_head.hpp,在所有代码之后包含h2_body.hpp

如果h1.hpp中的任何函数获取/返回向量或相关类型,那么最好假设main.cpp在包含h1时将具有
。另一种说法是h1需要一个vector类,因此在h1中不包含
,而是要求它包含在main.cpp中(在h1之前)-这是非常令人困惑的,因为没有编程方式来记录它(不,要求使用
typedef std::vector vector_t;
#define H1VECTOR std::vector
不是文档化的,这是错误的概括)。

如果
用作实现细节(即函数体),则将h1.hpp与h1\u head.hpp(声明)和h1\u body.hpp(定义)分开。如果您有结构/类,则可以隐藏详细信息,例如在类中声明
详细信息
结构/类,并仅在h1_body.hpp中定义它。在main.cpp中的代码之前包含h1_head.hpp,在所有代码之后包含h2_body.hpp



如果h1.hpp中的任何函数获取/返回向量或相关类型,那么最好假设main.cpp在包含h1时将具有
。另一种方法是说h1需要一个向量类,因此在h1中不包含
,但需要将其包含在main.cpp中(在h1之前)-然而,这是非常令人困惑的,因为没有编程方式来记录它(不,需要
typedef std::vector vector_t;
#define H1VECTOR std::vector
不记录,这是错误的概括).

预处理器的工作原理并非如此。如果头文件包含在它包含的任何位置。就编译器而言,它包含在main.cpp中,因为预处理器从h1.hpp添加它,因此编译器不会知道差异……因此需要在预处理器时间(或之前)完成…不确定这是否可能…@JoachimPileborg是的,我知道它没有什么问题。但我只想让编译器告诉我,它是由更深层次而不是直接包含的。这可能是一项静态分析工具工作。但是,我问它是否可以由编译器自己完成。@HumamHelfawi但编译器无法知道这一点,因为pre-processor在编译器运行之前对其进行排序…@code\u foeder在看到您的评论之前我写了它。好的,我明白了。因此我应该为此找到一些静态分析工具。预处理器实际上不是这样工作的。如果头文件包含在它包含的任何位置。就编译器而言,它包含在main.cpp中,因为预处理器添加了它来自h1.hpp,因此编译器不知道两者之间的区别……因此需要在预处理器时间(或之前)完成…不确定这是否可能…@JoachimPileborg是的,我知道它没有什么问题。但我只想让编译器告诉我,它是由更深层次而不是直接包含的。这可能是一项静态分析工具工作。但是,我问它是否可以由编译器自己完成。@HumamHelfawi但编译器无法知道这一点,因为pre-processor在编译器运行之前整理好它…@code\u fodder我在看到你的评论之前写的。好的,我明白了。所以我应该为此找到一些静态分析工具。嗯……除此之外,这个答案没有什么意义(或者我不够聪明,无法理解它),如果h1.hpp中的任何函数在编译时获取/返回向量并生成警告,您将如何测试
,这就是OP的要求:)请详细说明哪一部分对您没有意义,以便我可以为您和其他读者描述/编辑。是的,答案是基于用户控制h1.hpp的前提。请注意,无论函数是否获取/返回向量,第一段中的方法都适用。这显然不是OP所要求的,OP想知道
是因为h1.hpp还是因为main.cpp而包括在内。我仍然认为1。当
不在h1.hpp的界面和2上时,我的解决方案将起作用。如果它在接口上,那么你必须使用h1.hpp,包括它。但是你能解释一下,如果在main.cpp中使用它,当(并且仅当)它被间接包含时,这会如何产生错误/警告吗。h1_head.hpp:void fn();h1_body.hpp:#include void fn(){std::vector v;}main.cpp:#include“h1_head.hpp”int main(){fn()}#include“h1_body.hpp”在注释部分有点混乱,但希望您能将其删除:)。请注意,OP在间接包含时不要求有错误,但在未直接包含时要求有错误。在我的例子中,include本身将在main()之后移动。。。。除此之外,这个答案没有什么意义(或者我不够聪明,无法理解),您将如何测试h1.hpp中的任何函数是否在编译期间获取/返回向量并生成警告?-这就是OP所问的:)请详细说明哪部分对你来说没有意义,这样我可以为你和其他读者描述/编辑。是的,答案是基于用户控制h1.hpp的前提。请注意,无论函数是否获取/返回向量,第一段中的方法都适用。T