[英]Order of `static` definition and `extern declaration` in a translation unit
我無法理解為什么這不起作用。
extern int i;
int main()
{
printf(" %d ", i);
}
static int i =3;
此外,這不起作用:
extern int i;
static int i =3;
int main()
{
printf(" %d ", i);
}
但是如果static
變量在extern declaration
之前定義它的工作原理:
static int i =3;
extern int i;
int main()
{
printf(" %d ", i);
}
據我所知從extern int i
告訴i
在其他地方 ,這里看起來如何( int i
)
但是, 其他地方意味着:
1)也許,稍后指向same
global variable
same
翻譯單元。
2)也許,在other
一些轉化單位。
我認為(1)
即使static int i = 3
限制了i
的范圍到當前定義它的翻譯單元也是有效的。
是不是static int i =3
global
(我的意思是至少它在翻譯單元中是可見的),盡管它的翻譯單元的范圍有限嗎? 那么為什么編譯器無法找到呢?
當我編譯前兩個版本時,我得到以下編譯時錯誤:
error: static declaration of ‘i’ follows non-static declaration
note: previous declaration of ‘i’ was here
我無法理解此錯誤消息。 另外,為什么它作為一個靜態declaration
抱怨它不是一個definition
呢?
C11 6.2.2 標識符的鏈接第4節
對於在范圍內使用存儲類說明符extern聲明的標識符,其中該標識符的先前聲明是可見的,31)如果先前聲明指定內部或外部鏈接,則后面聲明中標識符的鏈接與在先前聲明中指定的聯系。 如果沒有先前聲明可見,或者先前聲明未指定鏈接,則標識符具有外部鏈接。
所以第二個聲明將遵循第一個,回到你的例子,第一個和第二個例子i
將有一個extern
存儲類。 編譯器認為這是一個錯誤。
雖然在第三個例子中, i
將是static
因為static
首先顯示。 那應該沒問題。
並且,在C11的第7節中6.2.2 標識符的鏈接
如果在翻譯單元內,同一標識符同時出現內部和外部鏈接,則行為未定義。
因此,最好不要在同一個翻譯單元中同時使用static
和extern
聲明相同的變量。
好吧,變量是extern
或static
。 請記住,全局級別的static
僅限制其對當前翻譯單元的可見性,而extern
指示它在不同的翻譯單元中可見。
將某些東西稱為static
而又將其稱為extern
是沒有意義的。 這樣做是未定義的行為,所以不要這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.