gpt4 book ai didi

c++ - 正确使用 'extern' 关键字

转载 作者:可可西里 更新时间:2023-11-01 16:27:44 26 4
gpt4 key购买 nike

有一些资源(书籍、在线资料)解释了 extern 的用法,如下所示:

extern int i;        // declaration - has 'extern'
int i = 1; // definition - specified by the absence of 'extern'

并且有支持以下语法的来源:

extern int i;        // declaration
extern int i = 1; // definition - specified by the equal sign
// Both marked with 'extern'

我的问题是 - 这是 CC++ 的区别,还是 pre-ANSIANSI 练习?

现在,更实际的问题:

使用第二种语法,我想创建一个全局对象(从每个编译单元可见)。构造函数不带参数,因此既不需要括号也不需要等号。

extern MyClass myobject;

现在编译器如何区分声明和定义?

编辑:回到学校后,我习惯了第一种语法 (Borland C)。后来我使用了一个编译器(可能是 GCC 的某个古老版本),它拒绝编译没有“外部”的定义。这就是让我感到困惑的原因。

最佳答案

特别是对于您的示例,在这里工作时 C 和 C++ 之间没有区别。适用于两种语言的基本规则是:如果您的声明包含一个初始化程序,那么它就是一个定义。时期。不管它是否有明确的 extern 都没有关系。如果它有一个初始化器,那么它就是一个定义

这意味着在命名空间范围内 extern int i = 1int i = 1 是等价的,即这样的声明中的 extern 是多余的。在 C++ 中,当声明的对象是 const 时,定义中的 extern 变得非冗余,因为 C++ 中的 const 对象默认具有内部链接。例如,extern const int c = 42; 定义带有外部链接的常量 c

如果声明没有初始值设定项,那么(并且只有到那时)它开始依赖于 extern 关键字的存在。对于 extern,它是一个非定义声明。如果没有 extern,它就是一个定义。 (在 C 语言中,这将是一个暂定 定义,但在我们的上下文中这不是重点)。

现在,针对您的实际问题。为了创建一个全局对象,您必须将其声明

extern MyClass myobject;

(通常在头文件中完成),然后在某个翻译单元中定义

MyClass myobject;

由于您的构造函数不接受任何参数,因此这是定义对象的唯一方法。 (从 C++11 开始,如果您愿意,您还可以使用 MyClass myobject{};。)

如果您必须向构造函数提供参数(例如,42),您将能够同时使用两者

MyClass myobject(42);

extern MyClass myobject(42);

作为定义,因为初始值设定项的存在确保它确实被解释为定义

关于c++ - 正确使用 'extern' 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11867431/

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