有一些来源(书籍、在线材料)解释了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'
我的问题是 - 这是一个C vs. C++区别,或者是pre-ANSI vs. ANSI实践?
现在,更实际的问题是:
使用第二种语法,我想创建一个全局对象(从每个编译单元都可见)。构造函数不带参数,因此不需要括号或等号。
extern MyClass myobject;
现在编译器如何区分声明和定义呢?
EDIT:回到学校后,我已经习惯了第一种语法(Borland C)。后来我使用了一个编译器(可能是 GCC 的某个古老版本),它拒绝编译没有“extern”的定义。这就是让我困惑的原因。
特别是对于您的示例,这里的 C 和 C++ 之间没有区别。适用于两种语言的基本规则是:如果您的声明包含初始化器,那么它是一个定义。时期。是否有明确的内容并不重要extern
是否在其中。如果它有一个初始化器,那么它是一个定义.
这意味着在命名空间范围内extern int i = 1
and int i = 1
是等价的,即extern
这样的声明是多余的。在 C++ 中extern
当声明的对象是时,定义中的内容变得非冗余const
, since const
C++ 中的对象默认具有内部链接。例如,extern const int c = 42;
定义常量c
具有外部链接。
如果声明没有初始值设定项,那么(并且只有那时)它才开始依赖于extern
关键词。和extern
它是一个非定义性声明。没有extern
它是一个定义。 (在 C 语言中,这将是暂定的定义,但这不是我们上下文中的重点)。
现在,回答你的实际问题。为了创建一个全局对象,你必须declare it as
extern MyClass myobject;
(通常在头文件中完成),然后define它在某些翻译单元中为
MyClass myobject;
由于您的构造函数不带参数,因此这是定义对象的唯一方法。 (从C++11开始你也可以使用MyClass myobject{};
如果你愿意的话。)
如果您必须向构造函数提供参数(例如,42
),您将能够同时使用
MyClass myobject(42);
and
extern MyClass myobject(42);
作为定义,因为初始化程序的存在确保它确实被解释为定义.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)