10

Cでは、なぜこれができないのですか:

arrayfn({1.0, 2.0, 3.0});

ifは、タイプまたはのいずれかarrayfnのパラメーターを 1 つ受け取る関数です。これを試すと、構文エラーが発生します。double[]double*

このようにCで何かを達成できる方法はありますか?コンパイル時に既知の配列を生成してすぐに渡すことで、コード行を事前に宣言して埋める必要がなくなりますか?

4

1 に答える 1

10

簡単な答え:複合リテラルを使用する必要があります。何かのようなもの

 arrayfn( (double[]) {1.0, 2.0, 3.0} );

仕事をするべきです。


いくつかの説明

部分に来て、複合リテラルの構文がないと、中括弧で囲まれた初期化子リストであるため、なぜarrayfn({1.0, 2.0, 3.0});機能しなかったのですか。{1.0, 2.0, 3.0}関数の引数として使用できる「オブジェクト」を示すものではありません。あなたが考えているように、それらは「定数配列」ではありません。

さらに情報を追加するには、引用してC11、章§6.5.2.5、複合リテラル

括弧で囲まれた型名とそれに続く中括弧で囲まれた初期化子のリストで構成される後置式は、複合リテラルです。これは、初期化子リストによって値が指定される名前のないオブジェクトを提供します。

于 2016-04-22T15:16:31.927 に答える