2012-11-08 208 views
0

可能重複:
Redefinition allowed in C but not in C++?C中的這個雙聲明是什麼意思?

#include<stdio.h> 
int i; 
int i; 
int main() 
{ 
     // int i; 
     // int i; 
     printf("%d\n",i); 
     return 0; 
} 
~   

上面的代碼運行wihtout給予任何錯誤gcc -Wall -Werror demo.c -o demo

但是,當我取消對locali變量註釋掉globali ,它給了我錯誤。

In function ‘main’: 
demo.c:7:6: error: redeclaration of ‘i’ with no linkage 
demo.c:6:6: note: previous declaration of ‘i’ was here 

這是什麼在這裏的本地全球概念?,任何人請解釋。

+0

它給您帶來了什麼錯誤? – Mansfield

+0

爲什麼downvoted .. ?? – Omkant

回答

1

如果所有定義都一致(全部具有相同類型)並且該變量在不多於一個位置初始化,則可以在全局範圍內對變量進行多個定義。

J.5.11多個外部定義

可能有一個對象的標識符,具有或不具有明確使用關鍵字的extern的多於一個的外部定義;如果定義不一致,或者多於一個被初始化,則行爲是不確定的(6.9.2)。

2

在C99中(更具體參見6.2節),全局聲明默認具有外部鏈接(6.2.2§5)。在這種情況下(6.2.2§2),我的兩個聲明都是指同一個對象。相反,局部變量沒有鏈接(6.2.2§6),因此應該引用唯一標識符(同樣是6.2.2§2):因此,您最終會得到兩個同名的局部變量相同範圍,不允許(6.2.1§5:)由相同標識符指定的不同實體或者具有不同的範圍,或者在不同的名稱空間中