这个代码行是在下面和在这句话下面提出的,是否被视为声明或定义?
extern const int &ri;
答案 0 :(得分:4)
这是一个宣言 - “外部”意味着它生活在其他地方。
答案 1 :(得分:3)
首先,声明和定义不是互斥的概念。每个定义都是同时声明(少数例外)。这意味着提出问题的正确方法是:“这是一个定义声明还是一个非定义声明?”。
请注意,我并不是说现在这样的问题毫无意义。问题很好,因为每个人都理解它的真正含义。我只是想把它作为介绍性说明。
其次,你在这里有一个非定义声明,这意味着这个声明不是一个定义(带有extern
说明符的引用或对象声明,但没有初始化器不是定义)。
如果是
extern const int &ri = 5;
我们还有声明,但这是定义声明(即恰好是定义的声明)。
答案 2 :(得分:3)
C ++ 03,§3.1,¶2:
声明是一个定义,除非......它包含extern说明符或连接规范,既不是初始化器也不是函数体......
因此,包含extern const int &ri;
说明符而不是初始值设定项的extern
是声明,但不是定义。
答案 3 :(得分:1)
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;
在命名空间级别使用const
会使声明或定义的变量具有内部链接,它就像一个不可变的 static
变量,它只存在于它自己的翻译单位。
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并且都没有明确声明 extern也没有声明过 外部联系;或
- 数据成员 一个匿名工会。
答案 4 :(得分:1)
除了其他任何东西,它几乎肯定是滥用参考。引用旨在用作函数参数和返回值。事实上你可以创建“引用变量”(我不知道如何描述它们)似乎是C ++语法的意外。是的,你可以用它们做技巧,但不,你不应该。
底线 - 如果您的引用不是参数或返回值,那么您可能做错了。除非你真的,真的知道你在做什么,在这种情况下你不会在这里询问它,不是吗?
答案 5 :(得分:0)
使用extern
表示该对象未在此处定义,而是在其他位置定义。