在定义变量时使用’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
)或已声明为extern
。 const
可以提供可变内部链接的事实偶尔意味着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
。)