[英]Is the static keyword needed in both the declaration and the definition of a static function in 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.