簡體   English   中英

靜態是什么意思?

[英]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 ++已經“回收”了該關鍵字以獲取完全不同的含義。)

您給變量賦予什么標識符 (例如tabtab2 )取決於您。 他們是什么語言得到很好的界定:

  • 您的第一個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)是在本地范圍內聲明的變量。 范圍確定在何處可訪問變量。

  • 局部變量顯然只能在聲明它們的范圍內訪問。
  • 文件范圍變量可在聲明該變量的整個轉換單元中訪問。 轉換單元是.c文件及其包括的所有.h文件。

儲存時間:

  • 靜態存儲持續時間意味着變量將在程序執行期間持續存在。 總是在調用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.

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