C99を知ってますか?

D言語リファレンスを和訳されたK.INABAさんに、トークンの説明の訳について質問メールをしたところ、面白い話を聞かせて頂きました。ちなみに質問自体は原文自体が間違っていて、かつみはえるの質問は的を外していました^^;

C言語には、現在「C99標準」という最新の規格があります。これを改めて見ると、なんとC++には無い機能だらけなのですね^^;。Cならunicodeが使えるんですよ奥さん(笑)。これじゃ本当にC++って時代遅れの言語になっちゃうじゃんかYO!

他にも以下のような機能があるそうで

コンパウンドリテラル
可変長配列
restrictポインタ
Designated Initializer
可変長マクロ
__func__

ってどれも何のことだかわかりません^^;。可変長配列ってSTL::Vectorみたいなもんですかね……C言語で? __func__は関数名をあらわすマクロかな。これがあるとデバッグが楽なんよねー(っていうか、toStringメソッドが簡単に構築できますわな)。時期C++には付くって話でしたけど先こされてますな^^;。

他のがわからんので調べてみました。お願い、グーグル先生!


restrictポインタ
そのポインタの指す対象にエイリアスがないことをプログラマが保証する。コンパイラはこの情報を元に最適化を行う。

可変長マクロ
#defineの中で"..."が使えるのだそうです。……メタプログラミングの可能性が広がりそうな予感

指定初期化子 (Designated Initializer)
構造体を宣言時に初期化する際に、任意のメソッドだけを初期化する事が出来る。……欲しい。

コンパウンドリテラル
(絶句)。http://seclan.dll.jp/c99d/c99d07.htm#dt19990516からコードを引用

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});
  //あるいは
  int pos_x, pos_y;
  ...
  pos_x = 640, pos_y = 480;
  ...
  PutPixel(&(point_t){pos_x, pos_y});
  ...

つまるところ、構造体の個々の要素に値を代入する際に、構造体名を短縮できるわけだが……。こんなのC言語じゃない(笑)。なんでC++に無いんだーっ!