C言語/C11の変更点

出典: フリー教科書『ウィキブックス(Wikibooks)』

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)には以下が含まれます:

  1. 条件付き(オプション)の機能(以前は必須だったものも含む)
  2. 複数の実行スレッドのサポート。改良されたメモリシーケンシングモデル、アトミックオブジェクト、スレッドローカルストレージが含まれる
  3. 追加の浮動小数点特性マクロ()
  4. オブジェクトのアラインメントの問い合わせと指定
  5. Unicode文字と文字列() (元々はISO/IEC TR 19769:2004で規定)
  6. 型汎用式
  7. 静的アサート
  8. 無名の構造体と共用体
  9. 戻り値のない関数を表す属性
  10. 複素数を作成するマクロ()
    // 複素数を作成する例
    #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を表します。crealcimagで複素数の実部、虚部を取得できます。
  11. 排他的アクセスでファイルを開くサポート
  12. gets関数の削除()
  13. aligned_allocat_quick_exitquick_exitの関数の追加()
  14. 境界チェックインターフェースの(条件付き)サポート (元々はISO/IEC TR 24731-1:2007で規定)
  15. 解析可能性の(条件付き)サポート