声明或定义

时间:2011-06-11 22:00:56

标签: c++

这个代码行是在下面和在这句话下面提出的,是否被视为声明或定义?

extern const int &ri;

6 个答案:

答案 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表示该对象未在此处定义,而是在其他位置定义。