一个位于函数中的外部变量?

时间:2013-06-01 00:10:01

标签: c++ extern

根据维基百科:

http://en.wikipedia.org/wiki/External_variable

  

外部变量也可以在函数内声明。

在函数中声明外部变量的目的是什么?它也必须是静态的吗?

5 个答案:

答案 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与块作用域组合使用,函数可以查看外部标识符,而不会混淆其他函数的名称空间。 (尽管如此,这通常是不好的做法。)