2016-07-14 33 views
-2

我有以下一段代码,我在需要使用它们的代码之后定义了几个外部(全局)变量。 为了做到这一点,我使用关键字extern宣布他们没有保留他们的存储。static中的关键字和外部变量C

int main(int argc,char *argv[]) 
{ 

    extern int a; 
    extern double b; 

    /* ...use the variables somehow... */ 

{ 

int a = 10; 
static double b = 2.0; 

,如果我这样做,编译器会抱怨说我定义b变量是静态的(因而具有内部链接),当在我宣布它为外部量。 但是,如果我倒序并在使用它之前将其定义并在main(主要是我知道的...)中声明它,那么永久化就没有问题。

static double b = 2.0; 

int main(int argc,char *argv[]) 
{ 

    extern int a; 
    extern double b; 

    /* ...use the variables somehow... */ 

{ 

int a = 10; 

那么如果我想在定义它之前使用外部私有变量(即与内部链接)呢?这是禁止的,为什么?

+0

一些有用的阅读在这里http://stackoverflow.com/questions/2841762/why-wont-extern-link-to-a-static-variable重复或许? – Bathsheba

+0

与问题无关,但您的主签名很奇怪:'int main void'。没有必要'void' – SurvivalMachine

+0

@SurvivalMachine只是一个拼写错误,谢谢。 – Luca

回答

1

extern关键字告诉编译器我们引用的变量位于不同的翻译单元(基本上是另一个源文件),而static关键字表示变量(在全局变量的情况下)是本地的当前的翻译单元,并且不能在其他源文件中看到,因此将这两个关键字一起使用是没有意义的。

一旦声明b作为文件全球性的,它是在main可见,没有必要再次声明,你就可以使用它。 另一方面,如果在中声明了不同的转换单元作为全局变量,则extern关键字将变为必需。

+0

是的,但是如果我想在定义(预留存储)之前使用它,该怎么办? 它需要成为一个共享的全球?如果我想让它成为一个私有的全局(有内部链接) – Luca

+0

全局变量的存储保留在程序的数据段中,并且在声明它之前不能使用全局变量(除了extern,但正如我所说这用于来自不同翻译单元的变量)。 – monkeyStix

+0

你应该格式化你的答案,并在句子的开头使用大写字母。 –