在c+中包含头文件+; P> C++总理,我没有对我要问的内容说太多,这就是我所要搜索的:
编译器编译#include“example.h”行时,会将example.h的内容复制到当前文件中 那么,如果这是真的,在下面的例子中,为什么B.h不知道A.h?文件是如何编译的?我是否必须在每个使用A.h的文件中包含A.h,然后在使用这些文件的程序.h中包含每个使用A.h的文件在c+中包含头文件+; P> C++总理,我没有对我要问的内容说太多,这就是我所要搜索的:,c++,include,C++,Include,编译器编译#include“example.h”行时,会将example.h的内容复制到当前文件中 那么,如果这是真的,在下面的例子中,为什么B.h不知道A.h?文件是如何编译的?我是否必须在每个使用A.h的文件中包含A.h,然后在使用这些文件的程序.h中包含每个使用A.h的文件 In program.h #include "A.h" #include "B.h" 警告:非常糟糕的代码: a.h #ifndef A_H #define A_H #define SOME_LIT "string
In program.h
#include "A.h"
#include "B.h"
警告:非常糟糕的代码:
a.h
#ifndef A_H
#define A_H
#define SOME_LIT "string lit in A.h"
#endif
b.h
#ifndef B_H
#define B_H
#include <iostream>
void foo() { std::cout << SOME_LIT << '\n'; }
#endif
印刷品:
$ ./a.out
string lit in A.h
因此,您可以看到b.h
了解a.h
中的定义。如果您忘记了#include“a.h”
,或将其放在#include“b.h”
下面,则会中断
但是,作为一般规则,您应该在需要的任何文件中明确地包含头。这样,您就知道您只关心main
中的foo
,所以您只需要#包含foo
标题,即b.h
:
#include "b.h"
int main()
{
foo();
}
警告:非常糟糕的代码:
a.h
#ifndef A_H
#define A_H
#define SOME_LIT "string lit in A.h"
#endif
b.h
#ifndef B_H
#define B_H
#include <iostream>
void foo() { std::cout << SOME_LIT << '\n'; }
#endif
印刷品:
$ ./a.out
string lit in A.h
因此,您可以看到b.h
了解a.h
中的定义。如果您忘记了#include“a.h”
,或将其放在#include“b.h”
下面,则会中断
但是,作为一般规则,您应该在需要的任何文件中明确地包含头。这样,您就知道您只关心main
中的foo
,所以您只需要#包含foo
标题,即b.h
:
#include "b.h"
int main()
{
foo();
}
是的!但是,在需要的时候直接包含一个标题是一种很好的做法。确实如此!但是,在需要时直接包含头是一种很好的做法。奇怪的是,它对我不起作用,对于我正在工作的一个mvc项目,我在它们各自的文件中有许多子类,基类在其各自的文件中,然后在控制器类文件中,我做了如下操作:#include“basefile.h”#include“child1.h”#包括“child2.h”等。。但是我得到了编译时错误,指出基类没有在child1.h(或类似的东西)中命名类型。好吧,在您的示例中,b.h只知道main.cpp上下文中a.h中的定义。如果只包含b.h,则会出现错误。2种可能性:1)您的编译配置不正确,因此无法获取其中一个标头。2) 你把东西按顺序放错了。我认为2是更常见的问题。这就是为什么建议在使用它的文件中始终包含所有需要的内容。@PureW是的,这正是问题所在。这还不清楚吗?我不知道如何在msvc中实现它,但是如果您可以使用g++
或clang++
,请使用-E
命令行选项仅应用预处理。然后你可以看到,#include
s实际上只是粘贴进来的。这很奇怪,它对我不起作用,对于我正在工作的一个mvc项目,我在它们各自的文件中有许多子类,基类在它各自的文件中,然后在控制器类文件中,我在做类似的事情:#include“basefile.h”#include“child1.h”#包括“child2.h”等。。但是我得到了编译时错误,指出基类没有在child1.h(或类似的东西)中命名类型。好吧,在您的示例中,b.h只知道main.cpp上下文中a.h中的定义。如果只包含b.h,则会出现错误。2种可能性:1)您的编译配置不正确,因此无法获取其中一个标头。2) 你把东西按顺序放错了。我认为2是更常见的问题。这就是为什么建议在使用它的文件中始终包含所有需要的内容。@PureW是的,这正是问题所在。这还不清楚吗?我不知道如何在msvc中实现它,但是如果您可以使用g++
或clang++
,请使用-E
命令行选项仅应用预处理。然后您可以看到,#include
s实际上只是粘贴进来的。