C言語

C言語のオプション機能について

C11以降のオプション機能を紹介します。

例)可変長配列について

C99で導入された可変長配列は、C11からオプション扱いとなりました。具体的には、マクロ __STDC_NO_VLA__ が定義されていれば、その処理系で可変長配列をサポートしていません。

以下は、このマクロを使ったコードです。

  • C90では、マクロが定義されていないため、可変長配列でエラーとなります。
  • C99では、マクロが定義されていませんが、可変長配列は必須機能なので、コンパイルできます。
  • C11以降では、マクロの有無によって、コードを分けることができます。
void func(int n)
{
#ifdef __STDC_NO_VLA__
	int a[10];
	printf("Define a[10]\n");
#else
	int a[n];
	printf("Define a[n]\n");
#endif
}

Conditional feature macros

このオプション機能は、ISO/IEC 9899:2011 6.10.8.3 Conditional feature macros で定められています。規格の記載順です。

マクロ名意味
__STDC_ANALYZABLE__この値が1であれば、Annex L Analyzability の仕様に準拠します。
__STDC_IEC_559__この値が1であれば、Annex F IEC 60559 浮動小数点数演算の仕様に準拠します。
__STDC_IEC_559_COMPLEX__この値が1であれば、Annex F IEC 60559 互換の複素数演算の仕様に準拠します。
__STDC_LIB_EXT1__この値が201ymmLであれば、Annex K Bounds-checking interface の仕様に準拠します。
__STDC_NO_ATOMICS__この値が1であれば、_Atomic<stdatomic.h> をサポートしません。
__STDC_NO_COMPLEX__この値が1であれば、複素数型と <complex.h> をサポートしません。
__STDC_NO_THREADS__この値が1であれば、<thread.h> をサポートしません。
__STDC_NO_VLA__この値が1であれば、可変長配列をサポートしません。

規格では、__STDC_NO_COMPLEX__ を定義する処理系では、__STDC_IEC_559_COMPLEX__ を定義してはならない、と定められています。

最後に

C言語のオプション機能について、自分の知識をまとめることができました。

C言語に関する理解を深めていきましょう。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA