精華區beta C_and_CPP 關於我們 聯絡資訊
static的用法 1.修飾函數內部的變數 生命期跟global變數一樣,因為不是放在stack 2.修飾函數或函數外部的變數 放在cpp(原文說的module)裡面則其他cpp檔看不到它們,放在header則各自獨立 3.修飾class member 表示這是類別的成員,而不是"物件"的成員 class body裡面的static data僅代表宣告,所以要在class body外定義一次 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.217.26.237 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1462692658.A.B27.html ※ 編輯: loveflames (180.217.26.237), 05/08/2016 15:37:17
bjk: 懂了2在講這個 https://goo.gl/Rhjy5A 05/08 15:41
bjk: ˇ3QQ 05/08 15:41
uranusjr: 原文明明是在講 C, 不是 C++ 吧 05/08 18:05
tomnelson: 樓上點破了,上篇內文有 05/08 18:28
tomnelson: "Static has three distinct uses in C" 這句 05/08 18:28
tomnelson: 所以原文只是討論C的部份,並沒有討論到C++的. 05/08 18:29
loveflames: C只是少了第3點,前面2點一樣 05/08 18:33
loveflames: 第2點換成C,只是把cpp檔改成c檔,其原理還是相通 05/08 18:34
tomnelson: 是呀,就是第三點不通XD 05/08 19:11
> -------------------------------------------------------------------------- < 作者: PkmX (阿貓) 看板: C_and_CPP 標題: Re: [問題] uses of the keyword static 時間: Mon May 9 14:11:58 2016 其實 static 在 C99 之後還有一個鮮少人知道的用法: #include <stddef.h> void foo(int a[static 42]) {} int main(void) { int x[41], y[42], z[43]; foo(x); foo(y); foo(z); foo(NULL); return 0; } $ clang -std=c11 -Wall -Wextra -pedantic -fsyntax-only main.c main.c:8:5: warning: array argument is too small; contains 41 elements, callee requires at least 42 [-Warray-bounds] foo(x); ^ ~ main.c:3:14: note: callee declares array parameter as static here void foo(int a[static 42]) {} ^~~~~~~~~~~~ main.c:11:5: warning: null passed to a callee that requires a non-null argument [-Wnonnull] foo(NULL); ^ ~~~~ main.c:3:14: note: callee declares array parameter as static here void foo(int a[static 42]) {} ^~~~~~~~~~~~ 順帶一題,修飾 array 參數的 qualifier 也是寫在 [] 裡面, 所以一個 function 的宣告可能可以長成這個樣子: void foo(int a[static const restrict 42], int b[static const restrict 42]); 另外因為標準規定只有 static <qualifier> 或 <qualifier> static 兩種寫法, 所以不能寫 const static restrict,這裡 clang 會噴一個令人摸不著頭緒的錯誤: error: expected expression void foo(int a[const static restrict 42]) { ^ 看到這裡有沒有覺得 C 語言真的是很親切呢^^