1. ホーム
  2. c

[解決済み] char s[static 10]のような関数の配列パラメータでstaticキーワードを使用する目的は何ですか?

2022-04-24 14:48:30

質問

ソースコードを見ていたら、こんな関数がありました。

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

実験してみると、他の修飾語も出現するようだ。

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

の中だけしか使えないようです。 [ ] 配列が関数のパラメータとして宣言されている場合。これらは何をするのですか?なぜ関数のパラメータでは違うのですか?

どのように解決するのですか?

最初の宣言は、コンパイラに 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 でした)。

パラメータを''型の配列''と宣言した場合、''型への修飾されたポインタ''に修正されなければならない。 [] の配列型導出の キーワードstaticが [] の場合,関数を呼び出すたびに,対応する実引数の値によって,少なくとも同じ数の配列の最初の要素にアクセスできなければならない。 を指定する。