プログラミング言語 C の新機能 Part XXVIII: コンパウンドリテラル (Compound Literal)
(1999/11/01 [月])
ついにこの機能の登場です。皆さんは次のような記述をする時に、これは面倒だと思ったことはないでしょうか?
関数 PutPixel の引数に単なる定数として point_t 型の値を渡したい。しかし現在の C 言語ではそのために変数を宣言してさらに値を代入する必要があります。しかし、この新機能を使えばこれは次のように書き直すことができます。
オブジェクト型または大きさの指定無しの配列を ( ) の中に記述して次にコンパウンド { } を記述することでコンパウンドリテラル (Compound Literal) を作ることができます。{ } の中は例にあるとおり指定初期化子を使った初期化も可能です。また (int[ ]){1, 2, 3, 4} のような配列定数を作り直接関数引数として渡すことも可能です。ただし可変長配列の定数はコンパウンドリテラルで作ることはできません。
typedef struct { int x, y; } point_t ; void PutPixel(const point_t *p) { ... } ... point_t p; p.x = 640, p.y = 480; PutPixel(&p); ... |
関数 PutPixel の引数に単なる定数として point_t 型の値を渡したい。しかし現在の C 言語ではそのために変数を宣言してさらに値を代入する必要があります。しかし、この新機能を使えばこれは次のように書き直すことができます。
typedef struct { int x, y; } point_t ; void PutPixel(const point_t *p) { ... } ... PutPixel(&(point_t){640, 480}); //または PutPixel(&(point_t){.x=640, .y=480}); ... |
オブジェクト型または大きさの指定無しの配列を ( ) の中に記述して次にコンパウンド { } を記述することでコンパウンドリテラル (Compound Literal) を作ることができます。{ } の中は例にあるとおり指定初期化子を使った初期化も可能です。また (int[ ]){1, 2, 3, 4} のような配列定数を作り直接関数引数として渡すことも可能です。ただし可変長配列の定数はコンパウンドリテラルで作ることはできません。
by seclan