答案 0 :(得分:4)
它允许限制对某个范围的全局访问:
int main()
{
extern int x;
x = 42; //OKAY
}
void foo()
{
x = 42; //ERROR
}
int x;
答案 1 :(得分:2)
在命名空间范围内声明外部变量之间的唯一区别:
extern int x;
void foo() {
cout << x;
}
并在功能范围内声明:
void foo() {
extern int x;
cout << x;
}
在后一种情况下,x
仅在函数内可见
您所做的只是进一步收紧extern
声明的范围。
以下是使用命名空间的类似示例:
在命名空间范围:
#include <string>
using std::string;
void foo() {
string str1;
}
string str2; // OK
在功能范围:
#include <string>
void foo() {
using std::string;
string str1;
}
string str2; // Error - `using` not performed at this scope
答案 2 :(得分:1)
外部声明进入函数内部。它只是意味着没有其他函数可以看到变量。
void func()
{
extern int foo;
foo ++;
}
void func2()
{
foo--; // ERROR: undeclared variable.
}
在另一个源文件中:
int foo; // Global variable. Used in the other source file,
// but only in `func`.
这只是一种“隔离”变量的方法,因此它不会在不应该使用的地方意外使用。
答案 3 :(得分:0)
该文本指的是函数内部的extern变量的非定义声明。函数内部的外部定义是非法的。
因此,函数内部的extern变量的非定义声明只是意味着你想在该函数中使用该变量。变量本身必须是在别处定义的全局变量。
基本上,如果您不需要访问整个翻译单元中的全局变量(在别处定义),并且只需要在该函数内部使用它,那么在本地声明它是非常好的主意。这样,您就不会使用没有其他功能需要的标识符来污染全局命名空间。
答案 4 :(得分:0)
extern
关键字表示标识符具有外部链接。这意味着它在与外部链接声明的任何地方都链接到相同的名称。也就是说,不同位置的名称的不同实例引用相同的对象。
在块中声明一个标识符(包括定义函数的块)为它提供块范围。标识符实例的范围在块的末尾结束。
将extern
与块作用域组合使用,函数可以查看外部标识符,而不会混淆其他函数的名称空间。 (尽管如此,这通常是不好的做法。)