簡體   English   中英

翻譯單元中的`static`定義和`extern聲明`的順序

[英]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 標識符的鏈接

如果在翻譯單元內,同一標識符同時出現內部和外部鏈接,則行為未定義。

因此,最好不要在同一個翻譯單元中同時使用staticextern聲明相同的變量。

好吧,變量是externstatic 請記住,全局級別的static僅限制其對當前翻譯單元的可見性,而extern指示它在不同的翻譯單元中可見。

將某些東西稱為static而又將其稱為extern是沒有意義的。 這樣做是未定義的行為,所以不要這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM