gpt4 book ai didi

c++ - 在 C 中使用 "extern"存储类说明符

转载 作者:太空宇宙 更新时间:2023-11-04 00:42:51 33 4
gpt4 key购买 nike

以下示例如何使用 extern specifer。

我们在文件 one.c 和 two.c 中都有一个全局变量 int x我们想在 three.c 中使用它们,所以在 three.c 中将这个变量声明为

extern int x;

当我们编译和链接这些文件时会发生什么?

我的回答是:所有这些文件的编译应该成功,但是链接器应该在链接时标记错误,因为 x 的多个声明。C++ 中的行为会有什么不同吗?

这些是否可以通过 C 和 C++ 中的两个文件同时引用 int x(在 three.c 中)。在 C++ 中,我想我们可以使用 namespace 来实现这一点。正确的?

最佳答案

默认情况下,全局变量具有外部链接,这意味着它们可以被其他源文件(或“翻译单元”)使用。如果您改为使用 static 声明全局变量关键字,它们将具有内部链接,这意味着它们将不能被其他源文件使用。

对于具有外部链接的变量,不能有多个同名变量,否则链接器会报错。不过,您可以有两个同名变量,只要其中至少一个具有内部链接即可,当然您不能在同一个源文件中引用这两个变量。

extern声明只是对编译器说“这是在另一个翻译单元中定义的具有外部链接的某个变量的名称”,允许您引用该变量。

C++完全一样,只是多了命名空间。如果将全局变量放在命名空间内,那么它们可以具有相同的名称而不会出现链接器错误,前提是它们位于不同的命名空间中。当然,所有对这些变量的引用都必须引用全名 namespace::var_name ,或使用 using建立本地命名空间上下文的声明。

C++ 也有匿名命名空间,完全等同于使用 static C 中全局变量的关键字:在匿名命名空间内声明的所有变量和函数都具有内部链接。

因此,要回答您原来的问题,您是对的——编译会成功,但链接会失败,因为变量 x 有多个定义。具有外部链接(具体来说,来自翻译单元 one.ctwo.c )。

来自 three.c , 无法同时引用两个变量 x .您需要重命名 x在一个或两个模块中,或切换到 C++ 并放置至少一个 x在命名空间内。

关于c++ - 在 C 中使用 "extern"存储类说明符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1787875/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com