Macros related to language levels

The following macros can be tested for C99 features, features related to GNU C, and other IBM language extensions. All of these macros except __STDC_VERSION__ are predefined to a value of 1 by a specific language level, represented by a suboption of the -qlanglvl compiler option, or any invocation or pragma that implies that suboption. If the suboption enabling the feature is not in effect, then the macro is undefined. For descriptions of the features related to these macros, see the XL C Language Reference.

Table 1. Predefined macros for language features
Predefined macro name Description Predefined when the following language level is in effect
__C99_BOOL Indicates support for the _Bool data type. extc1x | stdc99 | extc99 | extc89 | extended
__C99_COMPLEX Indicates that the support for C99 complex types is enabled or that the C99 complex header should be included. extc1x | stdc99 | extc99 | extc89 | extended
__C99_COMPLEX_HEADER__ Indicates support for C99-style complex headers. c99complexheader
__C99_CPLUSCMT Indicates support for C++ style comments

extc1x | stdc99 | extc99 | stdc89 | extc89 | extended (also -qcpluscmt)

__C99_COMPOUND_LITERAL Indicates support for compound literals. extc1x | stdc99 | extc99 | extc89 | extended
__C99_DESIGNATED_INITIALIZER Indicates support for designated initialization. extc1x | stdc99 | extc99 | extc89 | extended
__C99_DUP_TYPE_QUALIFIER Indicates support for duplicated type qualifiers. extc1x | stdc99 | extc99 | extc89 | extended
__C99_EMPTY_MACRO_ARGUMENTS Indicates support for empty macro arguments. extc1x | stdc99 | extc99 | extc89 | extended
__C99_FLEXIBLE_ARRAY_MEMBER Indicates support for flexible array members. extc1x | stdc99 | extc99 | extc89 | extended
__C99__FUNC__ Indicates support for the __func__ predefined identifier.

extc1x | stdc99 | extc99 | extc89 | extended

__C99_HEX_FLOAT_CONST Indicates support for hexadecimal floating constants. extc1x | stdc99 | extc99 | extc89 | extended
__C99_INLINE Indicates support for the inline function specifier. extc1x | stdc99 | extc99 (also -qkeyword=inline)
__C99_LLONG Indicates support for C99-style long long data types and literals. extc1x | stdc99 | extc99
__C99_MACRO_WITH_VA_ARGS Indicates support for function-like macros with variable arguments.

extc1x | stdc99 | extc99 | extc89 | extended

__C99_MAX_LINE_NUMBER Indicates that the maximum line number is 2147483647.

extc1x | stdc99 | extc99 | extc89 | extended

__C99_MIXED_DECL_AND_CODE Indicates support for mixed declaration and code. extc1x | stdc99 | extc99 | extc89 | extended
__C99_MIXED_STRING_CONCAT Indicates support for concatenation of wide string and non-wide string literals.

extc1x | stdc99 | extc99 | extc89 | extended

__C99_NON_LVALUE_ARRAY_SUB Indicates support for non-lvalue subscripts for arrays. extc1x | stdc99 | extc99 | extc89 | extended
__C99_NON_CONST_AGGR_INITIALIZER Indicates support for non-constant aggregate initializers. extc1x | stdc99 | extc99 | extc89 | extended
__C99_PRAGMA_OPERATOR Indicates support for the _Pragma operator.

extc1x | stdc99 | extc99 | extc89 | extended

__C99_REQUIRE_FUNC_DECL Indicates that implicit function declaration is not supported. stdc99
__C99_RESTRICT Indicates support for the C99 restrict qualifier.
__C99_STATIC_ARRAY_SIZE Indicates support for the static keyword in array parameters to functions. extc1x | stdc99 | extc99 | extc89 | extended
__C99_STD_PRAGMAS Indicates support for standard pragmas. extc1x | stdc99 | extc99 | extc89 | extended
__C99_TGMATH Indicates support for type-generic macros in tgmath.h extc1x | stdc99 | extc99 | extc89 | extended
__C99_UCN Indicates support for universal character names. extc1x | stdc99 | extc99 | ucs
__C99_VAR_LEN_ARRAY Indicates support for variable length arrays. extc1x | stdc99 | extc99 | extc89 | extended
__cplusplus The numeric value that indicates the supported language standard as defined by that specific standard. The format is yyyymmL. (For example, the format is 199901L for C99.)
__DIGRAPHS__ Indicates support for digraphs. extc1x | stdc99 | extc99 | extc89 | extended (also -qdigraph)
__EXTENDED__

Indicates that language extensions are supported.

extended
__IBM__ALIGN Indicates support for the __align type qualifier. Always defined except when -qnokeyword=__alignof is specified
__IBM_ALIGNOF__, __IBM__ALIGNOF__ Indicates support for the __alignof__ operator.

extc1x | extc99 | extc89 | extended

__IBM_ATTRIBUTES Indicates support for type, variable, and function attributes.

extc1x | extc99 | extc89 | extended

__IBM_COMPUTED_GOTO Indicates support for computed goto statements.

extc1x | extc99 | extc89 | extended

__IBM_EXTENSION_KEYWORD Indicates support for the __extension__ keyword.

extc1x | extc99 | extc89 | extended

__IBM_GCC__INLINE__ Indicates support for the GCC __inline__ specifier. extc1x | extc99 | extc89 | extended

__IBM_DOLLAR_IN_ID Indicates support for dollar signs in identifiers. extc1x | extc99 | extc89 | extended
__IBM_GENERALIZED_LVALUE Indicates support for generalized lvalues. extc1x | extc99 | extc89 | extended
__IBM_INCLUDE_NEXT Indicates support for the #include_next preprocessing directive.

Always defined

__IBM_LABEL_VALUE Indicates support for labels as values.

extc1x | extc99 | extc89 | extended

__IBM_LOCAL_LABEL Indicates support for local labels.

extc1x | extc99 | extc89 | extended

__IBM_MACRO_WITH_VA_ARGS Indicates support for variadic macro extensions.

extc1x | extc99 | extc89 | extended

__IBM_NESTED_FUNCTION Indicates support for nested functions. extc1x | extc99 | extc89 | extended
__IBM_PP_PREDICATE Indicates support for #assert, #unassert, #cpu, #machine, and #system preprocessing directives. extc1x | extc99 | extc89 | extended
__IBM_PP_WARNING Indicates support for the #warning preprocessing directive. extc1x | extc99 | extc89 | extended
__IBM_REGISTER_VARS Indicates support for variables in specified registers. Always defined.
__IBM__TYPEOF__

Indicates support for the __typeof__ or typeof keyword.

Always defined

__IBMC_COMPLEX_INIT Indicates support for the macro based initialization of complex types: float _Complex, double _Complex, and long double _Complex. extc1x
__IBMC_GENERIC Indicates support for the generic selection feature.

extc89 | extc99 | extended | extc1x

__IBMC_NORETURN Indicates support for the _Noreturn function specifier.

extc89 | extc99 | extended | extc1x

extended | extended0x | c1xnoreturn

__IBMC_STATIC_ASSERT Indicates support for the static assertions feature. extc89 | extc99 | extended | extc1x
_LONG_LONG Indicates support for long long data types.

extc1x | stdc99 | extc99 | | stdc89 | extc89 | extended (also -qlonglong)

__SAA__ Indicates that only language constructs that support the most recent level of SAA C standards are allowed. saa
__SAA_L2__ Indicates that only language constructs that conform to SAA Level 2 C standards are allowed. saal2
__STDC__ Indicates that the compiler conforms to the ANSI/ISO C standard.

Predefined to 1 if ANSI/ISO C standard conformance is in effect.

__STDC_HOSTED__ Indicates that the implementation is a hosted implementation of the ANSI/ISO C standard. (That is, the hosted environment has all the facilities of the standard C available).

extc1x | stdc99 | extc99

__STDC_VERSION__ Indicates the version of ANSI/ISO C standard which the compiler conforms to. The format is yyyymmL. (For example, the format is 199901L for C99.)


Voice your opinion on getting help information Ask IBM compiler experts a technical question in the IBM XL compilers forum Reach out to us