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言語に関する理解を深めていきましょう。