2013-01-17 69 views
4

我试过这三个小程序的版本,并且得到了一些有趣的结果。任何人都可以帮助我理解每种情况下的编译器行为。了解程序和GCC编译器行为中变量的多重声明

version 1.0 

int A; 
int A; 
int A; 

int main() 
{ 
    return 0; 
} 

Result: Got compiled with one copy of A in BSS. 


Version 2.0 

int main() 
{ 
    int A; 
    int A; 
    int A; 

    return 0; 
} 

Result: Failed to compile with complaining for re-declaration. 


Version 3.0 

int A; 

int main() 
{ 
    static int A; 
    return0; 
} 

result: Compiled with two copy of A in BSS. one is A and another a.<some numeric tag>. 
+0

Satpal查看这两个:[** 6.9.2外部对象定义**](http://c0x.coding-guidelines.com/6.9.2.html)和[**为什么变量不能是在C **中的两个文件中定义两次](http://stackoverflow.com/questions/4990315/why-a-variable-cant-be-defined-twice-in-2-files-in-c) –

回答

8

在你的第一个例子,是int A;暂定的定义:在文件范围内的识别符的不具有初始值设定和或者没有存储类或static存储类的声明。你可以有多个的,他们都将指向同一个变量:

的标准说: (ISO/IEC 9899:1999 6.9.2)

为一个对象标识符的声明具有不带初始值设定项的文件范围,并且没有存储类说明符或静态存储类说明符构成暂定义。如果翻译单元包含标识符的一个或多个试验性定义,并且翻译单元不包含该标识符的外部定义,则行为就好像翻译单元包含该标识符的文件范围声明一样,复合类型为的初始值等于0.

在第二个示例中,A不是文件范围。这是一个局部变量,它不是一个试探性的定义,所以你只能有一个。

在第三个示例中,文件范围内的A与main()中的A不同,因为它们具有不同的范围。仅仅因为第二个A是静态的不会改变它的范围;该标识符仍然只能从main()内部看到。这是一种变量阴影的情况,其中一个作用域中的变量与封闭作用域中的变量具有相同的标识符(在本例中为main()作用域与文件作用域)。文件范围内的A事实恰好暂时的定义不会影响main()内部的A