5.62 C99 の複合リテラル

ISO C99 は、複合リテラルをサポートしています。複合リテラルは、後にイニシャライザが続くキャストのようなものです。

複合リテラルの値はキャストで指定された型のオブジェクトで、イニシャライザで指定された要素が含まれています。また、複合リテラルは左辺値です。
例えば、
int *y = (int []) {1, 2, 3};
int *z = (int [3]) {1};

int *y = (int []) {1, 2, 3}; はコンパイラに受け付けられますが、int y[] = (int []) {1, 2, 3}; は高レベル(グローバル)な初期化としては受け付けられません。
以下のソースコード例での複合リテラルは次のとおりです。
  • (struct T) { 43, "world"}
  • &(struct T) {.b = "hello", .a = 47}
  • &(struct T) {43, "hello"}
  • (int[]){1, 2, 3}
struct T
{
   int a;
   char *b;
} t2;
void g(const struct T *t);
void f()
{
   int x[10];
   ...
   t2 = (struct T) {43, "world"};
   g(&(struct T) {.b = "hello", .a = 47});
   g(&(struct T) {43, "bye"});
   memcpy(x, (int[]){1, 2, 3}, 3 * sizeof(int));
}
関連する概念
5.59 C99 の新しい言語機能
5.61 C99 および C90 の // コメント
5.63 C99 の指定済みのイニシャライザ
5.64 C99 の 16 進浮動小数点数
5.65 C99 のフレキシブル配列メンバ
5.66 C99 の __func__ 定義済み識別子
5.67 C99 の inline 関数
5.68 C99 および C90 の long long データ型
5.69 C99 の使用する引数の数が一定でないマクロ
5.70 C99 の宣言とステートメントの混合
5.71 C99 の選択および反復ステートメントの新しいブロック有効範囲
5.72 C99 の _Pragma 処理命令
5.73 C99 の制限付きポインタ
5.75 C99 の複素数
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.