最近做的乙個任務,是在乙個執行緒中不斷接收udp包,並將包dump到檔案內
**這麼寫
#include #include #include //linux system call for thread id
#include #include void logmsg()
void *nbi(void *arg)
}int main()
執行完畢後,檢視log檔案,空檔案!
思索良久後才發現是乙個低階錯誤:c區域性變數每次都初始化,導致檔案重複開啟,並將上次寫入的內容沖走
但是檔案控制代碼放到函式外部也不好,怕汙染命名空間,於是想到了static修飾符
直接給loop和fp前面加static會報錯:
f_test.c: in function 'logmsg':
f_test.c:9:2: error: initializer element is not constant
static file *fp = fopen("/tmp/mo_send.txt", "w");
^
原來靜態變數本質上跟全域性變數一樣,只能用常量來初始化,只是編譯器在限制了其scope而已
再改**
#include #include #include //linux system call for thread id
#include #include void logmsg()
void *nbi(void *arg)
}int main()
再執行就log檔案就正常了。
靜態變數 非靜態變數的區別
c 變數根據定義位置的不同,具有不同的作用域,作用域可分為6種 全域性作用域,區域性作用域,語句作用域,類作用域,命名作用域和檔案作用域。從作用域看 全域性變數具有全域性作用域。全域性變數只需在乙個原始檔中定義,就可以作用於所有的原始檔。當然,其他不包括全域性變數定義的原始檔需要用extern關鍵字...
靜態變數和非靜態變數的區別
記憶體分配 靜態變數在應用程式初始化 被裝載 時,就存在於記憶體當中,直到它所在的類的程式執行結束時才消亡 而非靜態變數需要被例項化後才會分配記憶體。生存週期 靜態變數生存週期為應用程式的存在週期 非靜態變數的存在週期取決於例項化的類的存在週期。呼叫方式 靜態變數只能通過 類.靜態變數名 呼叫,類的...
靜態變數與非靜態變數之間的區別
學習ios時候經常遇到有static修飾的變數和沒有static的變數,在ios中主要用到 它們之間的區別是 如 static nsstring identify identify 與nsstring identify identify 1 作用範圍不一樣,有static修飾的identity的內容...