ソースコードを閲覧中に、次のような関数に遭遇しました。
void someFunction(char someArray[static 100])
{
// do something cool here
}
実験してみると、他の修飾子もそこに現れる可能性があるようです。
void someFunction(char someArray[const])
{
// do something cool here
}
[
]
修飾子は、配列が関数のパラメータとして宣言されている場合にのみ、内で許可されるようです。 これらは何をするのでしょうか? 関数パラメータの場合はなぜ異なるのでしょうか?
ベストアンサー1
最初の宣言はコンパイラにsomeArray
、少なくとも100 要素の長さ。これは最適化に使用できます。たとえば、 はsomeArray
決して にならないことも意味しますNULL
。
C 標準では、関数の呼び出しがこれらの要件を満たしていない場合 (つまり、サイレントな未定義の動作である場合) にコンパイラが診断することを要求していないことに注意してください。
2 番目の宣言は、単にsomeArray
(someArray
の要素ではありません!) を const として宣言します。つまり、 と書くことはできませんsomeArray=someOtherArray
。これは、パラメータが である場合と同じですchar * const someArray
。
この構文は、関数パラメータ リスト内の配列宣言子の最も内側でのみ使用可能です[]
。他のコンテキストでは意味がありません。
上記の両方のケースをカバーする標準テキストは、C11 6.7.6.3/7 (C99 では 6.7.5.3/7) にあります。
パラメータを「型の配列」として宣言する場合は、「型への修飾子付きポインタ」に調整する必要があります。この場合、型修飾子 (存在する場合) は、配列型の派生の
[
and内で指定]
されます。キーワード static も配列型の派生の[
and内に表示される場合は]
、関数の各呼び出しで、対応する実引数の値は、サイズ式で指定された要素数以上の配列の最初の要素へのアクセスを提供します。