C++ 为什么它会编译“是否”;“外部”;使用了什么?

C++ 为什么它会编译“是否”;“外部”;使用了什么?,c++,compilation,C++,Compilation,在a.cpp中: int t() { //definition goes here ... } b、 cpp: #include "a.h" int main() { t(); } 最后,a.h: extern int t(); //int t(); 这两种形式的a.h都有效,为什么?因为函数默认为extern,所以extern关键字是多余的。有些人喜欢显式添加extern,当他们想要提示其他开发人员在.cpp文件中找不到与此.h文件同名的函数定义时,他们会在声明函数的位置添

在a.cpp中:

int t()
{
  //definition goes here
  ...
}
b、 cpp:

#include "a.h"

int main()
{
  t();
}
最后,a.h:

extern int t();
//int t();

这两种形式的a.h都有效,为什么?

因为函数默认为extern,所以extern关键字是多余的。有些人喜欢显式添加extern,当他们想要提示其他开发人员在.cpp文件中找不到与此.h文件同名的函数定义时,他们会在声明函数的位置添加注释。但从编译器的角度来看,它不会影响任何东西。

因为函数默认为extern,所以extern关键字是多余的。有些人喜欢显式添加extern,当他们想要提示其他开发人员在.cpp文件中找不到与此.h文件同名的函数定义时,他们会在声明函数的位置添加注释。但从编译器的角度来看,它不会影响任何东西。

这取决于您用来编译的命令行IIRC。这取决于您用来编译的命令行IIRC。变量呢?我试过
intj
extern intj ExtNe/Cuff>,你将在包含A.h的每个单元中有一个新的定义:<代码> j/COD>,在你所展示的代码中,你只在B.CPP中包含了那个文件,但是如果你把它包含在其他地方,那么你将有多个定义,C++禁止。尽管编译器不必对此抱怨。@Wp2:这不是可移植的C。尽管C严格禁止函数/变量的多个定义(一个定义规则),但它不允许在不同的文件中多次声明变量/函数。一些编译器处理
intj仅作为一个声明,并推断它是否也是一个定义,从而在除一个声明/定义外的所有声明/定义中隐式插入
extern
。您可以通过键入
intj=0,强制编译器将其视为一个定义强制编译器声明和定义
j
。这在所有编译器上都会失败。因此结论是,对于要在多个.cpp文件中使用的.h文件,将变量声明为extern,对吗?@wp2:corret。另一种说法是,永远不要在头文件中声明/定义变量,只能在头文件中声明函数和类。但是如果你真的,真的,真的需要,那么你必须把它声明为extern。变量呢?我试过
intj
extern intj ExtNe/Cuff>,你将在包含A.h的每个单元中有一个新的定义:<代码> j/COD>,在你所展示的代码中,你只在B.CPP中包含了那个文件,但是如果你把它包含在其他地方,那么你将有多个定义,C++禁止。尽管编译器不必对此抱怨。@Wp2:这不是可移植的C。尽管C严格禁止函数/变量的多个定义(一个定义规则),但它不允许在不同的文件中多次声明变量/函数。一些编译器处理
intj仅作为一个声明,并推断它是否也是一个定义,从而在除一个声明/定义外的所有声明/定义中隐式插入
extern
。您可以通过键入
intj=0,强制编译器将其视为一个定义强制编译器声明和定义
j
。这在所有编译器上都会失败。因此结论是,对于要在多个.cpp文件中使用的.h文件,将变量声明为extern,对吗?@wp2:corret。另一种说法是,永远不要在头文件中声明/定义变量,只能在头文件中声明函数和类。但是如果你真的,真的,真的需要,那么你必须将它声明为extern。