読者です 読者をやめる 読者になる 読者になる

とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

GCC 4.6.0 20101127 (experimental) における C1X 対応状況

プログラム言語C C1X C++

GCC 4.6.0 でC言語の次期規格C1Xの実装が少しずつ進められているようです。
今回は以下のバージョンでテストをしてみました。

gcc.exe (GCC) 4.6.0 20101127 (experimental)
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

-std=c1x, -std=gnu1x

コンパイルオプションで -std=c1x と -std=gnu1x がこっそりと(?)追加されています。

gcc -std=c1x c1x.c
gcc -std=gnu1x gnu1x.c

こんな感じで使えます。
本家でググってもまだまともな情報はほとんどありませんね。

typedef

全く同じ定義の typedef が OK になりました。

int main()
{
 typedef int i;
 typedef int i;
}

こんなコードがコンパイルできるようになりました。
この挙動は C++ (C++03) でも同じです。C++ に少し近づきましたね。

anonymous structures and unions

無名構造体・共用体が使えるようになりました。

int main()
{
 struct s{
  struct{ int a; };
  int b;
 };
 struct s test;
 test.a = 0;
 test.b = 1;
}

struct s の内側の struct が無名構造体です。C++ (C++03) ではサポートされていません。

_Static_assert

_Static_assert が使えるようになりました。

int main()
{
 _Static_assert(1, "1");
 // _Static_assert(0, "0");
}

こんな感じで使えます。コメントをはずすと

c:/a.c: In function 'main':
c:/a.c:4:2: error: static assertion failed: "0"

と,ちゃんとコンパイルエラーになってくれます。
しかし, で static_assert マクロはまだ定義されていないようです。残念。
_Static_assert の詳細はこちらをご覧くださいませ。
_Static_assert とは - 危ないRiSKのブログ
C++0x では static_assert として同様の機能が提供されています。

<float.h> のマクロ

C1X で追加される新しいマクロが定義されました。
以下のコードでコンパイル通ります。

#include<float.h>
#include<stdio.h>
int main()
{
 printf("%d\n", FLT_HAS_SUBNORM);
 printf("%d\n", DBL_HAS_SUBNORM);
 printf("%d\n", LDBL_HAS_SUBNORM);
 printf("%d\n", FLT_DECIMAL_DIG);
 printf("%d\n", DBL_DECIMAL_DIG);
 printf("%d\n", LDBL_DECIMAL_DIG);
 printf("%g\n", FLT_TRUE_MIN);
 printf("%g\n", DBL_TRUE_MIN);
 printf("%Lg\n", LDBL_TRUE_MIN);
}

実行結果:

1
1
1
9
17
21
1.4013e-045
4.94066e-324
4.94066e-324

__STDC_VERSION__

__STDC_VERSION__ の値が更新されています。

#include<stdio.h>
int main()
{
 printf("%ld\n", __STDC_VERSION__);
}

実行結果:

201000