→ 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 語言真的是很親切呢^^