声明或定义是否确定了C ++中变量的范围?

时间:2009-10-29 18:41:18

标签: c++

哪个决定了变量,声明或定义的范围?


我读到的文件说声明确定了范围,但我自己的测试反过来说:

我通过链接器得到“未定义的对i的引用”错误:

#include <iostream> // Stream declarations
using namespace std;
    extern int i; //declaration
int prueba();

int main() {
    int i; //Definition
    i=6;
    prueba();
} ///:~

int prueba(){
     cout << i; //cannot access to the scope of i;
}

5 个答案:

答案 0 :(得分:4)

宣言。您可以声明外部的某些内容,并且无论在何处定义,它都可以在该文件中显示。同样,函数在声明的任何地方都可见。

除了externs和函数之外,我想不出一种方法来声明一个不能定义它的变量......

编辑:OTOH,静态(全局)变量,范围由定义决定,这也是声明。

编辑2:基本上我认为我的观点是你不能真正有一个不是宣言的定义。所以,唯一有趣的情况是声明不是一个定义,而且基本上是外部的另一个文件中的全局,以及函数声明......

答案 1 :(得分:2)

两者都决定范围 - 只是他们确定了微妙不同的事物的范围。

C / C ++中对象的定义决定了实际对象在哪个范围内可见,并确定了对象或函数的“最大可见范围”。

声明确定名称的特定“实例”在哪个范围内可见。

例如,全局变量在全局范围内定义(当然),并且可能在全局范围或更严格的范围内可见。但是,全局变量g_var的以下声明仅在函数foo()中可见:

void foo(void)
{
    extern int g_var;    // the variable g_var has global scope, but this
                         //    declaration has function-level scope

    printf( "g_var is: %d\n", g_var);
}

Brian Postow's point这种区别实际上只适用于全局变量和函数,这是一个很好的记忆。

答案 2 :(得分:1)

它在定义的...声明符中输入范围。所以

int x=3;
{
  int x=x; // x is initialized to itself, uninitialized.
}

遗憾的是,iso c ++规范不是免费提供的,所以我不能引用章节和诗句。

答案 3 :(得分:0)

定义决定范围。

答案 4 :(得分:0)

来自C标准的online version

  

6.1.2.3标签名称是唯一具有功能范围的标识符。   它可以使用(在goto语句中)   在它的功能中的任何地方   出现,并由隐式声明   它的句法外观(其次是   a:和声明)。

     

6.2.1.4每个其他标识符的范围由放置位置决定   其声明(在声明者或   类型说明符)。如果是声明者或   声明的类型说明符   标识符出现在任何标识之外   阻止或参数列表,   标识符有文件范围,其中   终结于   翻译单位。如果是声明者或   声明的类型说明符   标识符出现在块或   在参数列表中   函数定义中的声明,   标识符有块范围,其中   终结于   相关块。如果是声明者或   声明的类型说明符   标识符出现在列表中   函数中的参数声明   原型(不是功能的一部分)   定义),标识符有   功能原型范围,其中   终止于函数的末尾   声明符。如果是标识符   指定两个不同的实体   同名空间,范​​围可能   交叠。如果是这样,一个范围   实体(内部范围)将是一个   严格的范围子集   其他实体(外部范围)。内   内部范围,标识符   指定在中声明的实体   内在范围;宣布的实体   外部范围是隐藏的(而不是   可见的)在内部范围内。

强调我的。