C言語/C11の変更点
< C言語
2024年5月時点の最新のJIS C『プログラム言語 C』はJISX 3080:2003であり、これは ISO/IEC 9899:1999(Programming languages―C)及び ISO/IEC 9899 Technical Corrigendum 1:2001 を和訳したもので、その後改定 ISO/IEC 9899:2011(いわゆるC11)やISO/IEC 9899:2017(いわゆるC18)の内容を反映した JIS C の改定は行われておらず、現実の言語処理系の実装と JIS C の間で乖離が進んでいます。
他方、C18は仕様上の変更はなく __STDC_VERSION__ の定義が 201710L に更新されただけです。
そこで、この章では JISX 3080:2003 の元になった ISO/IEC 9899:1999+TC1:2001 とISO/IEC 9899:2011の差異を説明することで、JIS Cと現実の間を埋めようと思います。
第3版の主な変更点(__STDC_VERSION__ 201112L)には以下が含まれます:
- 条件付き(オプション)の機能(以前は必須だったものも含む)
- 複数の実行スレッドのサポート。改良されたメモリシーケンシングモデル、アトミックオブジェクト、スレッドローカルストレージが含まれる
- 追加の浮動小数点特性マクロ()
- オブジェクトのアラインメントの問い合わせと指定
- Unicode文字と文字列() (元々はISO/IEC TR 19769:2004で規定)
- 型汎用式
- 静的アサート
- 無名の構造体と共用体
- 戻り値のない関数を表す属性
- 複素数を作成するマクロ()
// 複素数を作成する例 #include <complex.h> #include <stdio.h> int main() { double complex z1 = CMPLX(1.0, 2.0); // 1.0 + 2.0i float complex z2 = I * I; // -1.0 + 0.0i * (-1.0 + 0.0i) = 1.0 printf("z1 = %.1f%+.1fi\n", creal(z1), cimag(z1)); printf("z2 = %.1f%+.1fi\n", crealf(z2), cimagf(z2)); return 0; }
- この例では、complexヘッダーから複素数型と関連する演算子、マクロが使われています。CMPLX(1.0, 2.0)で複素数1.0+2.0iを作成し、IマクロはIの値-1.0+0.0iを表します。
creal
、cimag
で複素数の実部、虚部を取得できます。
- 排他的アクセスでファイルを開くサポート
gets
関数の削除()aligned_alloc
、at_quick_exit
、quick_exit
の関数の追加()- 境界チェックインターフェースの(条件付き)サポート (元々はISO/IEC TR 24731-1:2007で規定)
- 解析可能性の(条件付き)サポート