2011-11-16 53 views
3

我研究了聲明和定義的概念(聯繫,範圍,持續時間)。在Visual Studio中不允許複製外部靜態聲明?

但我發現一個令人費解的錯誤:

下面的代碼是在GCC和Visual Studio 2010的

#include <stdio.h> 

extern int a = 7; 
extern int a; 

int main() 
{ 
    printf("%d\n", a); 
} 

但下面的代碼罰款生成在Visual Studio中的錯誤,但罰款GCC:

#include <stdio.h> 

static int a = 7; 
static int a; 

int main() 
{ 
    printf("%d\n", a); 
} 

error C2370: 'a' : redefinition; different storage class 

它只是在Visual Studio編譯器中的錯誤?

編輯:這個問題竟然是的this重複。

+0

我相信C和C++在這個問題上的不同 - 我認爲C特別指出,在同一個文件static'變量'兩個定義是指相同的變量,而C++有這個問題(我不記得他們爲什麼改變它)。確保你在Visual Studio中編譯爲C而不是C++。 –

+0

這是一個c程序。的 – SHH

+2

可能重複[重新定義一個全局變量時,不爲什麼重新定義靜態全局變量給出一個編譯時錯誤?(http://stackoverflow.com/questions/7215818/why-does-redefining-a-static- global-variable-give-a-compile-time-error-when-rede) –

回答

4

static int a;本身沒有初始化是一個「試探性的定義」,所以它應該是罰款。它看起來像微軟有某種延伸,抓住你。

編輯 - 它看起來像一個微軟的問題。看看這個related question。 C規範本身很清楚你的代碼是好的。從6.9.2外部對象定義

A declaration of an identifier for an object that has file scope without an initializer, and without a storage-class specifier or with the storage-class specifier static, constitutes a tentative definition. If a translation unit contains one or more tentative definitions for an identifier, and the translation unit contains no external definition for that identifier, then the behavior is exactly as if the translation unit contains a file scope declaration of that identifier, with the composite type as of the end of the translation unit, with an initializer equal to 0.

+0

哇,我需要提高我的搜索技巧。這是一個重複。感謝您的搜索和指出! – SHH

+0

@SHH - 我通過搜索「暫定義」找到了這個重複。如果你不是在尋找那個確切的短語,它可能會很難找到。 –

+0

這是如何工作的自動變量?爲什麼暫定義不適用於他們呢? – Bazooka