32

どうやら、次の関数プロトタイプは C99 と C11 で有効です。

void foo(int a[const *]);

void bar(int a[static volatile 10]);

これらの奇妙な添字表記*static、および CV 修飾子の目的は何ですか?

静的に型指定された配列と可変長配列を区別するのに役立ちますか? それとも単なるシンタックスシュガーですか?

4

1 に答える 1

27

パラメータ配列宣言子の静的

 void f(int a[static 10]);

staticこれは、parameteraがポインターでintあるが、配列オブジェクト (aは最初の要素へのポインター) に少なくとも10要素があることを示しています。

fコンパイラには、引数がそうでないと仮定する権利があるNULLため、いくつかの最適化を実行できます。gcc現在、最適化を実行していません ( source ):

「パラメーター配列宣言子の静的によって提供される情報は、最適化には使用されません。将来、プリフェッチの作業と組み合わせて使用​​することは理にかなっています。」

パラメータ配列宣言子の修飾子

void g(int a[cvr 10]);

insideg acvrポインターint( cvr is constvolatileまたはrestrict修飾子) です。たとえば、 with constit は(つまり、 type ) へaconstポインターであることを意味します。intint * const

したがって、パラメーター宣言:

T param[cvr e] 

パラメータ宣言と同じです:

T * cvr param

* パラメータ配列宣言子内

void h(int a[*]);

関数宣言 (関数定義の一部ではない) 内の[*]仮配列パラメーター宣言は、仮配列が可変長配列であることを示します。

于 2013-07-09T22:56:51.890 に答える