web-dev-qa-db-ja.com

「char s [static 10]」のような関数の配列パラメーターの静的キーワードの目的は何ですか?

いくつかのソースコードを参照しているときに、次のような関数に出会いました。

void someFunction(char someArray[static 100])
{
    // do something cool here
}

いくつかの実験では、他の修飾子もそこに表示される可能性があります。

void someFunction(char someArray[const])
{
    // do something cool here
}

配列が関数のパラメーターとして宣言されている場合、修飾子は[]内でのみ許可されているようです。これらは何をしますか?関数パラメーターが異なるのはなぜですか?

129
dreamlax

最初の宣言は、someArray少なくとも 100要素長であることをコンパイラーに伝えます。これは最適化に使用できます。たとえば、someArrayがNULLにならないことも意味します。

C標準では、関数の呼び出しがこれらの要件を満たさない場合(つまり、サイレントな未定義の動作)をコンパイラが診断する必要がないことに注意してください。

2番目の宣言は、単にsomeArraysomeArrayの要素ではない!)をconstとして宣言します。つまり、someArray=someOtherArrayと書くことはできません。パラメーターがchar * const someArrayの場合と同じです。

この構文は、関数パラメーターリストの配列宣言子の最も内側の[]内でのみ使用でき、他のコンテキストでは意味がありません。

上記の両方のケースをカバーする標準テキストは、C11 6.7.6.3/7にあります(C99では6.7.5.3/7でした)。

「型の配列」としてのパラメーターの宣言は、「型への修飾ポインター」に調整されます。型修飾子(存在する場合)は、[および]内で指定されたものです。配列タイプの派生。キーワードstaticが配列タイプの派生の[および]内にも現れる場合、関数の呼び出しごとに、対応する実際の引数の値は配列の最初の要素へのアクセスを提供します。サイズ式で指定された数以上の要素を持つ。

115