在c+中包含头文件+; P> C++总理,我没有对我要问的内容说太多,这就是我所要搜索的:

在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

编译器编译#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 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实际上只是粘贴进来的。