以下extern说明符的示例用法如何表现.
我们在文件one.c和two.c中都有一个全局变量int x.我们想在three.c中使用它们所以在three.c中声明了这个变量as
extern int x;
编译和链接这些文件时会发生什么?
我的答案是:所有这些文件的编译应该成功,但是由于x的多个声明,链接器应该在链接时标记错误.C++中的行为会有什么不同吗?
这些是在C和C++中同时从两个文件引用int x(在three.c中)的任何方式.在C++中,我想我们可以使用命名空间来实现这一点.对?
默认情况下,全局变量具有外部链接,这意味着它们可以被其他源文件(或"翻译单元")使用.如果您使用static关键字声明全局变量,它们将具有内部链接,这意味着它们将无法被其他源文件使用.
对于具有外部链接的变量,不能有多个具有相同名称的变量,否则链接器会抱怨.但是,只要至少有一个具有内部链接,您就可以拥有两个具有相同名称的变量,当然,您无法在同一源文件中引用它们.
一个extern声明只是对编译器说"这里是一个变量的名称,在另一个转换单元中定义了外部链接",允许你引用该变量.
除了添加名称空间之外,C++完全相同.如果全局变量放在命名空间内,那么它们可以具有相同的名称而不会出现链接器错误,前提是它们位于不同的命名空间中.当然,对这些变量的所有引用都必须引用全名namespace::var_name,或者使用using声明来建立本地名称空间上下文.
C++也有匿名命名空间,它完全等同于static在C中使用全局变量的关键字:在匿名命名空间内声明的所有变量和函数都有内部链接.
所以,为了回答你原来的问题,你是对的 - 编译会成功,但由于变量的多个定义x与外部链接(特别是来自翻译单元one.c和two.c),链接会失败.
从three.c,没有办法同时引用这两个变量x.您需要x在一个或两个模块中重命名,或切换到C++并在x命名空间中放置至少一个.