它使在C99
任何區別,當一個在頭(*.h
)文件寫入const int x = 1;
與static const int x = 1;
?靜態常量
靜態常量
回答
正如cdarke說的那樣,它有所不同。
const int x = 1;
爲包含h文件的每個模塊創建一個鏈接器可見符號。
鏈接器應該停止並返回一個錯誤,因爲同一個符號有多個(可見的)定義。
static const int x = 1;
爲每個模塊創建一個變量但不包含鏈接器符號,包括您的h文件。
鏈接器可以鏈接代碼,但是當您創建具有相同名稱的變量的多個實例時,它不確定您的代碼是否按預期工作。
Btw。在h文件中定義一個變量是一個絕對不好的主意,標準的方法是在c文件中定義它們,並且只在h文件中聲明它們(如果你真的需要訪問它們)。
當您只想在一個模塊中使用變量時,您可以使用static
,並且它應該對所有其他人不可見。
const ...
只有當你真的需要從另一個模塊訪問它,但恕我直言,你通常應該避免全球訪問變量。
myfile.c文件
#include "myFile.h"
const int x=1;
static const int y=2;
myFile.h
extern const int x;
就我個人而言,我不認爲在頭文件中定義一個「static const int」是一個「絕對不好」的想法。它只是在C語言中通常毫無意義 - 幾乎所有的用途都是'#define'或枚舉類型,並且有些東西可以使用'#define'/enum,因爲你不能使用' static const int',比如一個struct的數組成員的大小。頭文件中的非常量對象可能難以證明:-) –
@Steve - 是的,我特別想到非const對象 – jeb
是的。首先,我不建議你將這些定義放在一個頭文件中,但是如果你這樣做,則取決於包含頭文件的位置。無論如何,static
使當前程序單元的本地變量。這裏有一個例子:
mp1.c:
#include <stdio.h>
void myfunc(void);
const int x = 1;
int main (int argc, char *argv[])
{
printf ("main: value of x: %d\n",x);
myfunc();
return 0;
}
mp2.c:
#include <stdio.h>
extern int x;
void myfunc(void)
{
printf ("myfunc: value of x: %d\n",x);
}
編譯:
gcc -o mp mp1.c mp2.c
工作正常。現在改變mp1.c使用static const int x = 1;
當我們編譯(實際上它的鏈接錯誤),我們得到:
home/user1> gcc -o mp mp1.c mp2.c
/tmp/ccAeAmzp.o: In function `myfunc':
mp2.c:(.text+0x7): undefined reference to `x'
collect2: ld returned 1 exit status
變量x不mp1.c.的外部可見
這同樣適用於static
前綴函數。
- 1. PHP5:常量vs靜態
- 2. perl靜態常量hashrefs
- 3. 上`靜態常量WCHAR *`
- 4. 常量與靜態只讀
- 5. 靜態常量定義類
- 6. 靜態常量成員
- 7. 靜態庫和常量
- 8. 類中靜態常量ODR
- 9. android-strings.xml vs靜態常量
- 10. 差異靜態常量和靜態的返回時,一個靜態變量
- 11. C#靜態和常量變量內存
- 12. IOS公共靜態常量當量
- 13. 重寫一個靜態常量變量
- 14. 引用父變量的靜態常量
- 15. Objective-C靜態常量變量
- 16. Java圖標常量 - 靜態常量是否正常?
- 17. 「靜態字符常量*常量」優於「靜態常量字符」的關聯對象鍵的優點是什麼?
- 18. 在swift類的靜態函數中訪問非靜態常量
- 19. 靜態的常量成員,靜態類和瓶頸
- 20. 如何創建靜態NSString常量的靜態NSString []?
- 21. 靜態斷言檢查靜態常量類數據成員?
- 22. 靜態函數常量靜態成員函數
- 23. 使用靜態只讀與靜態獲取器模仿常量
- 24. FieldOperator類不包含靜態常量
- 25. 靜態常量Vs定義指令
- 26. 靜態常量類成員聲明
- 27. 常量與保護靜態只讀
- 28. 懷疑與靜態常量varaible
- 29. Java枚舉與靜態常量
- 30. 常量不能標記靜態
我通常預先準備的靜態標識符的功能initializate一個變量,所以在第一次調用該功能可按後,任何其他調用不會再次重新初始化該變量。如果嘗試重新初始化變量,該變量就像一個常量。如果你的變量被聲明爲const,你永遠不能修改它。 –