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 件のコメント:
ISO C99の複合リテラル (compound literals) で使用可能になったようです。
https://stackoverflow.com/questions/16104734/literal-array-in-c
ただし、この機能はISO C++には存在せず、C++ではコンパイラーの独自拡張で実装されていることに注意が必要です。
コメントを投稿