どうやら、次の関数プロトタイプは C99 と C11 で有効です。
void foo(int a[const *]);
void bar(int a[static volatile 10]);
これらの奇妙な添字表記*
、static
、および CV 修飾子の目的は何ですか?
静的に型指定された配列と可変長配列を区別するのに役立ちますか? それとも単なるシンタックスシュガーですか?
どうやら、次の関数プロトタイプは C99 と C11 で有効です。
void foo(int a[const *]);
void bar(int a[static volatile 10]);
これらの奇妙な添字表記*
、static
、および CV 修飾子の目的は何ですか?
静的に型指定された配列と可変長配列を区別するのに役立ちますか? それとも単なるシンタックスシュガーですか?
パラメータ配列宣言子の静的
void f(int a[static 10]);
static
これは、parametera
がポインターでint
あるが、配列オブジェクト (a
は最初の要素へのポインター) に少なくとも10
要素があることを示しています。
f
コンパイラには、引数がそうでないと仮定する権利があるNULL
ため、いくつかの最適化を実行できます。gcc
現在、最適化を実行していません ( source ):
「パラメーター配列宣言子の静的によって提供される情報は、最適化には使用されません。将来、プリフェッチの作業と組み合わせて使用することは理にかなっています。」
パラメータ配列宣言子の修飾子
void g(int a[cvr 10]);
insideg
a
はcvrポインターint
( cvr is const
、volatile
またはrestrict
修飾子) です。たとえば、 with const
it は(つまり、 type ) へa
のconst
ポインターであることを意味します。int
int * const
したがって、パラメーター宣言:
T param[cvr e]
パラメータ宣言と同じです:
T * cvr param
* パラメータ配列宣言子内
void h(int a[*]);
関数宣言 (関数定義の一部ではない) 内の[*]
仮配列パラメーター宣言は、仮配列が可変長配列であることを示します。