-1
#include<stdio.h> 
int check,check; 
void main(){ 
    printf("Hello!!"); 
} 

當我編譯這段代碼,一切都正常,但我把這個當主函數中,全局變量聲明

#include<stdio.h> 
void main(){ 
int check,check; 
    printf("Hello!!"); 
} 

我得到這樣

C:\MinGW\bin>cc ex1.c 
ex1.c: In function 'main': 
ex1.c:4:11: error: redeclaration of 'check' with no linkage 
int check,check; 
     ^
ex1.c:4:5: note: previous declaration of 'check' was here 
int check,check; 
    ^
錯誤

這是爲什麼?

+0

您正在聲明2個具有相同名稱的變量。變量的名稱只能包含下劃線,字母和數字。 – Mordi

回答

1

這在全球範圍內是可能的,因爲這被認爲是暫時的定義。

引用C11,章§6.9.2

爲具有文件作用域沒有初始化的對象的標識符的聲明,和 沒有存儲類說明或與存儲類說明static ,構成了一個 暫定義。

然而,在塊範圍(功能範圍),沒有暫定定義,因此代碼嘗試創建兩個標識符與作爲原因爲重新聲明錯誤相同的名稱,因爲它們實際上表示同一個對象。

您可以閱讀更多關於它here

也就是說,自C99以來,對於託管環境,void main()不再是有效簽名,它至少必須是int main(void)

+0

要說清楚:文件範圍內的兩個「檢查」表示**相同的**對象! (和「功能範圍」限制性太大,對於塊範圍來說總是如此) – Olaf