簡體   English   中英

在定義中使用 static 關鍵字與 C 中的聲明

[英]Using static keyword in definition vs declaration in C

以下編譯良好,僅在聲明 function 期間使用static

#include <stdio.h>

static int a();

int a(){
 return 5;
}

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

附帶說明一下, inline函數會發生與上述相同的行為,即只有聲明可以具有關鍵字。

然而,以下失敗,做同樣的但在一個變量上:

#include <stdio.h>

static int a;

int a = 5;

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

出現錯誤: non-static declaration of 'a' follows static declaration

有什么區別?

來自 C 標准的此引用顯示了差異)6.2.2 標識符的鏈接)

5 如果 function 的標識符聲明沒有存儲類說明符,則其鏈接的確定與使用存儲類說明符 extern 聲明時完全相同。 如果 object 的標識符聲明具有文件 scope 並且沒有存儲類說明符,則其鏈接是外部的。

因此,function 看起來像它具有隱式存儲說明符extern (但這並不意味着它具有與 object 標識符相反的外部鏈接,在這種情況下具有外部鏈接)。

現在根據以下報價

4對於在 scope 中使用存儲類說明符 extern 聲明的標識符,其中該標識符的先前聲明是可見的,31) 如果先前的聲明指定內部或外部鏈接,則后面聲明的標識符的鏈接是相同的作為先前聲明中指定的鏈接。 如果前面的聲明不可見,或者前面的聲明沒有指定鏈接,則標識符具有外部鏈接

因此,function 由於其初始聲明與存儲說明符 static 具有內部鏈接。

至於變量的標識符,那么

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

上述引述的簡歷如下。 如果 function 沒有明確指定的存儲 class 說明符extern則其鏈接由先前的 function 聲明確定(如果存在這樣的聲明)。 至於 object 的標識符,那么在這種情況下它具有外部鏈接。 如果事先聲明了帶有內部鏈接的標識符,則行為未定義。

暫無
暫無

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

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