哪个决定了变量,声明或定义的范围?
我读到的文件说声明确定了范围,但我自己的测试反过来说:
我通过链接器得到“未定义的对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;
}
答案 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每个其他标识符的范围由放置位置决定 其声明(在声明者或 类型说明符)。如果是声明者或 声明的类型说明符 标识符出现在任何标识之外 阻止或参数列表, 标识符有文件范围,其中 终结于 翻译单位。如果是声明者或 声明的类型说明符 标识符出现在块或 在参数列表中 函数定义中的声明, 标识符有块范围,其中 终结于 相关块。如果是声明者或 声明的类型说明符 标识符出现在列表中 函数中的参数声明 原型(不是功能的一部分) 定义),标识符有 功能原型范围,其中 终止于函数的末尾 声明符。如果是标识符 指定两个不同的实体 同名空间,范围可能 交叠。如果是这样,一个范围 实体(内部范围)将是一个 严格的范围子集 其他实体(外部范围)。内 内部范围,标识符 指定在中声明的实体 内在范围;宣布的实体 外部范围是隐藏的(而不是 可见的)在内部范围内。
强调我的。