如何解决声明或定义
| 这句话下面和下面给出的代码行是否被视为声明或定义?extern const int &ri;
解决方法
这是一个声明-“ extern \”表示它位于其他位置。
, C ++ 03,§3.1,¶2:
声明是一个定义,除非...它包含外部说明符或链接规范,并且既不包含初始化程序也不包含函数体...
因此,包含
extern
说明符而不是初始化程序的extern const int &ri;
是声明,而不是定义。
, 首先,声明和定义不是互斥的概念。每个定义都同时是一个声明(几乎没有例外)。这意味着提出问题的正确方法是:“这是定义性声明还是非定义性声明?”。
请注意,我并不是说现在的问题毫无意义。这个问题很好,因为每个人都明白它的真正含义。我只是想将此作为介绍性注释。
其次,这里的内容是一个未定义的声明,这意味着该声明不是定义(带有(2ѭ说明符但没有初始化程序的引用或对象声明不是定义)。
的情况下
extern const int &ri = 5;
我们也会有一个声明,但这将是一个定义声明(即恰好是定义的声明)。
, extern const int &ri;
它仅是一个没有定义的声明,这表明该变量是在其他地方定义的。
此类代码通常在.h
文件中找到,其定义在.cpp
文件中找到。如果您在多个文件中包含头文件,则可以使用这种方法来避免多次重定义错误。像这样:
//lib.h
extern Type object; //declaration Only;
//lib.cpp
#include \"lib.h\"
Type object = /*some initialization - optional*/; //definition
//A.cpp
#include \"lib.h\"
Type oA = object;
//B.cpp
#include \"lib.h\"
Type oB = object;
在命名空间级别使用“ 9”会使变量被声明或定义为具有内部链接,它就像一个不变的“ 10”变量,仅存在于其自己的转换单元中。
extern const
使变量具有外部链接,同时,变量是常量。
namespace N
{
const int i = 10; //i has internal linkage
extern const int j = 10; //j has external linkage
}
在这种情况下,使用extern
使变量具有外部链接!
§3.5/ 3 [basic.link]:
具有名称空间范围的名称(3.3.5)
具有内部链接(如果是名称)
的
—对象,引用,功能或
显式的功能模板
声明为静态或,
—对象或
明确声明的引用
const且未明确声明
外部或以前没有声明
外部联系;要么
—数据成员
匿名工会的成员。
, 除其他外,几乎肯定是滥用参考。引用旨在用作函数参数和返回值。可以创建“参考变量”(我不知道该如何描述它们)的事实似乎是C ++语法的偶然原因。是的,您可以使用它们来欺骗,但是不,您不可以。
底线-如果引用不是参数或返回值,则可能是做错了。除非您真的非常了解自己在做什么,否则您将不会在这里询问它,对吧?
, 使用extern
表示该对象不在此处定义,而是在其他地方定义。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。