在定义变量时使用’extern’关键字

看到这个答案后,我有这个疑问。 在我的项目中,我看到了一些外部变量声明和定义如下:

file1.h

extern int a; 

在file1.c

 extern int a=10; 

但在我提到的链接中,它说在c文件中应该定义如下:

 int a = 10; 

在定义期间添加extern关键字是否也有任何目的/意义。 或者重要的是顺便说一下?

它没有改变意义。 extern仅在声明变量时才有意义。 使用extern 定义变量是相同的,因为所有未标记为static全局变量都是默认情况下链接器可见的符号。

请注意,如果您不想初始化变量,即没有part = 10 ,编译器将假定extern int a始终是声明而不是定义 。 从同样的意义上说,将int a全局变量始终是一个定义 ,而不仅仅是一个声明

这取决于。 在这种情况下,它没有任何区别,但它可以。

这里有两个问题:定义与公正,以及联系。 并且C ++不以正交方式处理它们。 在C ++中,当且仅当extern关键字和初始化都不存在时,变量或引用的声明才是定义。 (请注意,函数,类型和模板的规则是不同的。)所以:

 extern int a; // not a definition int a; // definition extern int a = 42; // definition int a = 42; // definition 

规则说你必须只有一个定义,所以你在源文件中放置一个定义,在头文件中放置声明。

关于链接,声明为变量或引用的符号如果在命名空间范围内声明,则具有外部链接,未声明为static ,并且不是const (在C ++ 11中也不是constexpr )或已声明为externconst可以提供可变内部链接的事实偶尔意味着extern是必要的:

 int const a = 42; // internal linkage extern int const a = 42; // external linkage 

请注意, extern不必在同一声明中:

 extern int const a; // declaration, in header... int const a = 42; // external linkage, because of // previous extern 

不过,我偶尔需要extern ; 通常是因为我想使用局部常量来实例化模板。 (如果模板参数采用指针或引用,这只是一个问题。您可以使用带有int const a = 42;int参数实例化模板int const a = 42;因为模板是使用值42实例化的,而不是变量a 。)