[英]What is the meaning of static?
考慮以下代碼:
static uint8_t tab[] = {1, 2};
void foo() {
uint8_t tab2[] = {1, 2};
}
我在這里有兩個數組,一個是帶有static
關鍵字的數組,第二個是在函數內的數組。 我應該如何正確命名每個人? 因為那兩個是靜態的。 我知道區別在於tab
數組將永遠存在,而tab2
僅在執行函數foo()
時存在。 如果tab2
是在函數退出后死亡的靜態數組,是否不應該將其稱為另一個? 這些數組在編程理論中的專有名稱是什么?
另一個例子:
void bar() {
static uint8_t tab[] = { 1, 2 };
}
根據此類變量的編程理論,專有名稱是什么? “靜態的靜態”數組?
的static
關鍵字表示靜態存儲持續時間和內部連接 (除非在方框范圍,在那里它意味着靜態存儲持續時間和沒有連鎖如塊范圍的東西都從來沒有連接)。
您的tab2
不是靜態的 ,它具有自動存儲時間並且沒有鏈接。 (甚至有一個關鍵字auto
,它是隱含的,但是通常不使用。不要將此與C ++混淆,C ++已經“回收”了該關鍵字以獲取完全不同的含義。)
您給變量賦予什么標識符 (例如tab
或tab2
)取決於您。 但他們是什么語言得到很好的界定:
tab
是兩個uint8_t
的靜態全局數組。 它具有靜態存儲期限和內部鏈接。 tab2
是兩個uint8_t
的塊作用域數組。 它具有自動存儲期限,並且沒有鏈接。 tab
是兩個uint8_t
的靜態塊范圍數組。 它具有靜態存儲期限,並且沒有鏈接。 這里似乎存在誤解。 這不完全是您的錯,在C語言中看到“靜態”意味着至少兩個不同的事物。
您的tab2
不是靜態的。 它沒有靜態存儲持續時間,也沒有與靜態存儲相關的任何方式。 它只是一個數組。 這是一個局部變量,它是一個數組。
您的tab
是一個全局數組,為其提供了靜態存儲持續時間,並且由於關鍵字static
而具有內部鏈接。 如果在函數內,則為“函數靜態”。
如果我是你,我不會為術語擔心太多。 相反,請擔心使您的程序執行您想要的操作!
清除條款:
1) static uint8_t tab[] = {1, 2};
2) void foo() { uint8_t tab2[] = {1, 2}; ...
范圍:
1)是在文件作用域聲明的變量。 2)是在本地范圍內聲明的變量。 范圍確定在何處可訪問變量。
儲存時間:
main()
之前將此類變量初始化為零或特定值。 在文件作用域聲明的所有變量均具有靜態存儲持續時間。
所有聲明為static
變量都具有靜態存儲持續時間。
在本地范圍內聲明的所有變量(不帶static
)均具有自動存儲期限。
(對於extern
等,還存在其他一些情況,但這在這里不相關。這里有鏈接一詞,在這里我不會解決。)
知道這一點,那么“因為這兩個是靜態的”是沒有意義的。 它們具有靜態設置的固定大小,但這就是它們的共同點。
關於命名,這是主觀的,並且要取決於您自己的編碼標准。 給他們直觀的名稱,說明它們包含的內容,而不是它們的類型。
一些較舊的編碼標准喜歡將static
聲明的文件作用域變量視為私有變量,因此使用_
前綴來表明這一點。 但這是不好的做法,因為它會違反C標准(和POSIX標准)的命名規則。
那些歸入編程理論的數組的專有名稱是什么?
命名標識符不是編程理論的一部分。 如何命名它們取決於最佳實踐,慣例,公司標准等。 而如何做到這一點則基於意見。
C有很多變量類 (名稱是我的),范圍(變量可以訪問代碼的哪一部分)和持續時間有所不同。
在文件級別(任何功能之外):
在函數或塊內部:
另外,可以將變量聲明為extern
。 在這種情況下,僅聲明變量,並且必須在同一編譯單元或另一編譯單元中使用相同聲明在其他位置定義該變量。
為了詳盡無遺,C對於持續時間有另一種類別:已分配。 它用於通過malloc創建的對象,這些對象將持續存在,直到顯式釋放它們為止。 但要注意:程序員有責任使用正常范圍規則保留指向該對象的指針,以便能夠釋放它。
filescope聲明中的static
表示“本地於此翻譯單元”。
例:
static int variable=42;
static int function(){return 0;}
//won't be visible in other translation units
static
上塊范圍的聲明是指“具有靜態存儲持續時間”:
例:
uint8_t *bar() {
static uint8_t tab[] = { 1, 2 };
return &tab[0];
//ok with static but pretty much always an error otherwise
}
int how_many_times_i_ran(){ static unsigned x; return x++; }
在“數組類型”函數參數的括號內的static
表示后面的整數表達式表示指針必須指向的最小元素數。
void take3(int Three[static 2+1]);
void call()
{
take3((int[3]){0}); //OK
take3(0); //undefined
take3((int[2]){0}); //undefined
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.