2009年1月28日水曜日

C言語 の配列リテラル

配列を直接初期化してCのプログラム中に書くことができる.こんな感じ.
int A[] = {1, 2, 3};
昔は,グローバル変数か,main関数の中でしか初期化つきで宣言できない,とかいう実装が透けて見えるような制約があったように記憶しているのだけど,gccの4だとごく普通に関数の中でも宣言できるようだ.

で,この書き方は変数の初期化にのみ使えて,例えば関数呼び出しの引数に直接書くことはできない.

void foo(int x[]){}
...
foo({1, 2, 3}); // syntax error

int A[] = {1, 2, 3};
foo(A);         // OK
以前から面倒な仕様だと思っていたのだが,調べてみたらいつの間にか直接書く方法ができていた.
void foo(int x[]){}

foo((int []){1, 2, 3});
見通しは悪いけど,一度変数を宣言するよりはだいぶまし.

これは手元のgcc 4.xで試して動いたというだけなので,どの範囲のコンパイラでサポートされているのかは不明.C90あたりで入っていたんじゃないかと思うので,ほとんどのコンパイラで使えそうだけど.

1 件のコメント:

senooken さんのコメント...

ISO C99の複合リテラル (compound literals) で使用可能になったようです。
https://stackoverflow.com/questions/16104734/literal-array-in-c

ただし、この機能はISO C++には存在せず、C++ではコンパイラーの独自拡張で実装されていることに注意が必要です。