ため{3, 4}
それは失敗し、それが有効な初期化子だけれども、(少なくとも、それはC言語ではありません。C++の詳細については下記を参照)の式ではありません。
Cのすべての式は、式自体を調べることで判別できるタイプです。 {3, 4}
は潜在的にタイプstruct T
、またはint[2]
(配列タイプ)、または他の多くのタイプのいずれかである可能性があります。 (struct T)
がないキャストであることを
b = (struct T){3, 4};
注:
C99は、式を作成、複合リテラルの初期化子に似た構文を使用していますが、種類を指定できと呼ばれる新機能を追加しましたオペレーター;複合リテラルの構文の一部です。
複合リテラルの詳細については、draft C11 standardのセクション6.5.2.5を参照してください。
複合リテラルは、1999 ISO C標準(C99)によって導入されました。あなたのコンパイラがC99以上(* Cough * Microsoft * Cough *)をサポートしていない場合は、それらを使用することはできません。
C++を使用している場合(別の言語であることを忘れないでください)、複合リテラルはサポートされていませんが、代替語句が存在する可能性があります。 Potatoswatterコメントで指摘するように、この:
b = T{3, 4};
はC++ 11(ただし、C++言語の以前のバージョンで)で有効です。これはC++標準のセクション5.2.3 [expr.type.conf]でカバーされています。そのことについては
は、この:
b = {3, 4};
も有効なC++ 11構文です。このフォームは、割り当ての右側を含む多くの指定されたコンテキストで使用できます。これは、C++標準のセクション8.5.4 [dcl.init.list]でカバーされています。
最新のC++標準ドラフトの1つはN3485です。
(g ++はC++でC99スタイルの複合リテラルを拡張子としてサポートしています。)
そして、あなたが事前C99コンパイラで立ち往生している場合、あなたはいつものような、独自の初期化関数を書くことができます:それはC99を追加した理由である余分な作業の迷惑量(だ
struct T init_T(int x, int y) {
struct T result;
result.x = x;
result.y = y;
return result;
}
/* ... */
struct T obj;
/* ... */
obj = init_T(3, 4);
複合リテラル)が、それは仕事をします。一方、ほとんどの場合、あなたはおそらく、初期化を使用した方がいいでしょう:より良いおそらくある
struct T obj;
/* ... */
{
struct T tmp = { 3, 4 };
obj = tmp;
}
は、あなたのプログラムが構成されている方法によって異なります。
私はこれを知っていた** dupe:http://stackoverflow.com/q/16614045/694576 – alk
@これはまったくダブではありません。もう一つのリンクは構造体に構造体を割り当てることについて話しますが、これは構造体に初期化子を割り当てることに関するものです。 – user1952500
'b = {3,4};'は初期化ではなく、代入です。前者は 'T b = {3,4} 'です。はい、その2つは異なる獣です... :-)初期化は定義中に行われます。他のすべてのケースで割り当てが行われます。 – alk