-qlanglvl (-std)
类别
等效编译指示
#pragma选项langlvl,#pragma langlvl
另请参阅 #pragma operator_new
用途
确定源代码是否符合特定语言标准或者某项标准的子集或超集。 当源代码包含相应的标准或 IBM® 扩展功能时,相应的选项设置需要生效。
语法
语法
缺省值
-std=gnu99 或 获取 -std=gnu9x xlc 及相关调用命令
-std=gnu++98 用于 xlC 或 xlc++ 以及相关调用命令
默认设置根据调用编译器的命令而定:
- 针对 xlc 和相关调用命令的 -qlanglvl=extc99:ucs
- cc 和相关调用命令的 -qlanglvl=extended:noucs
- c89 和相关调用命令的 -qlanglvl=stdc89:noucs
- 针对 c99 和相关调用命令的 -qlanglvl=stdc99:ucs
默认设置取决于调用编译器的命令:
- 针对 xlC 或 xlc + + 以及相关调用命令的 -qlanglvl=extended
- 表 1中列出了不同语言级别 (compat366, strict98, extended (C++) 和 extended0x) 的 功能部件相关 子选项及其缺省设置。 缺省设置 "开启" 表示启用子选项; 否则,缺省设置 "关闭" 表示禁用子选项。
表 1. 不同语言级别的子选项的缺省设置 选项 语言级别 compat366 strict98 扩展 (C + +) extended0x -qlanglvl=anonstruct | noanonstruct 关闭 关闭 开启 开启 -qlanglvl=anonunion | noanonunion 开启 关闭 开启 开启 -qlanglvl=ansifor | noansifor 关闭 开启 开启 开启 -qlanglvl=ansisinit | noansisinit 开启 开启 开启 开启 -qlanglvl=自动类型推断| 不自动类型推断
关闭 关闭 关闭 开启 -qlanglvl=c1xnoreturn | noc1xnoreturn 关闭 关闭 开启 开启 -qlanglvl=c99__func__ | noc99__func__ 关闭 关闭 开启 开启 -qlanglvl=c99complex | noc99complex 关闭 关闭 关闭 关闭 -qlanglvl=c99complexheader | noc99complexheader 关闭 关闭 关闭 关闭 -qlanglvl=c99compoundliteral | noc99compoundliteral 关闭 关闭 开启 开启 -qlanglvl=c99hexfloat | noc99hexfloat 关闭 关闭 开启 开启 -qlanglvl=c99longlong | noc99longlong
关闭 关闭 关闭 开启 -qlanglvl=c99preprocessor | noc99preprocessor
关闭 关闭 关闭 开启 -qlanglvl=c99vla | noc99vla 关闭 关闭 开启 开启 -qlanglvl=compatrvaluebinding | nocompatrvaluebinding
关闭 关闭 关闭 关闭 -qlanglvl=同胞 | no同胞 关闭 关闭 关闭 关闭 -qlanglvl=complexinit | nocomplexinit 关闭 关闭 开启 开启 -qlanglvl=constexpr | noconstexpr
关闭 关闭 关闭 开启 -qlanglvl=decltype | nodecltype
关闭 关闭 关闭 开启 -qlanglvl=defaultanddelete | nodefaultanddelete
关闭 关闭 关闭 开启 -qlanglvl=委托者 | 取消委托者
关闭 关闭 关闭 开启 -qlanglvl=dependentbaselookup | nodependentbaselookup 开启 开启 开启 关闭 -qlanglvl=emptystruct | noemptystruct 开启 开启 开启 开启 -qlanglvl=explicitconversionoperators | noexplicitconversionoperators
关闭 关闭 关闭 开启 -qlanglvl=extendedfriend | noextendedfriend
关闭 关闭 关闭 开启 -qlanglvl=extendedintegersafe | noextendedintegersafe
关闭 关闭 关闭 关闭 -qlanglvl=externtemplate | noexterntemplate
关闭 关闭 开启 开启 -qlanglvl=FileScopeConstExternLinkage | noFileScopeConstExternLinkage 关闭 关闭 关闭 关闭 -qlanglvl=inlinenamespace | noinlinenamespace
关闭 关闭 关闭 开启 -qlanglvl = gnu_assert | nognu_assert 关闭 关闭 开启 开启 -qlanglvl = gnu_complex | nognu_complex 关闭 关闭 关闭 关闭 -qlanglvl = gnu_computedgoto | nognu_computedgoto 关闭 关闭 开启 开启 -qlanglvl = gnu_explicitregvar | nognu_explicitregvar 关闭 关闭 开启 开启 -qlanglvl = gnu_externtemplate | nognu_externtemplate 关闭 关闭 开启 开启 -qlanglvl = gnu_labelvalue | nognu_labelvalue 关闭 关闭 开启 开启 -qlanglvl = gnu_locallabel | nognu_locallabel 关闭 关闭 开启 开启 -qlanglvl = gnu_include_next | nognu_include_next 开启 开启 开启 开启 -qlanglvl = gnu_membernamereuse | nognu_membernamereuse 关闭 关闭 开启 开启 -qlanglvl = gnu_suffixij | nognu_suffixij 关闭 关闭 开启 开启 -qlanglvl = gnu_varargmacros | nognu_varargmacros 关闭 关闭 开启 开启 -qlanglvl = gnu_warning | nognu_warning 关闭 关闭 开启 开启 -qlanglvl=illptom | noillptom 开启 关闭 开启 开启 -qlanglvl=implicitint | noimplicitint 开启 关闭 开启 开启 -qlanglvl=newexcp | nonewexcp 关闭 关闭 关闭 关闭 -qlanglvl=nullptr | nonullptr
关闭 关闭 关闭 开启 -qlanglvl=offsetnonpod | nooffsetnonpod 开启 关闭 开启 关闭 -qlanglvl=olddigraph | noolddigraph 关闭 开启 关闭 关闭 -qlanglvl=oldfriend | nooldfriend 开启 关闭 开启 关闭 -qlanglvl=oldmath | nooldmath 开启 关闭 关闭 关闭 -qlanglvl=oldtempacc | nooldtempacc 开启 关闭 开启 开启 -qlanglvl=oldtmplalign | nooldtmplalign 开启 关闭 关闭 关闭 -qlanglvl=oldtmplspec | nooldtmplspec 开启 关闭 开启 开启 -qlanglvl=redefmac | noredefmac 关闭 关闭 关闭 关闭 -qlanglvl=referencecollapsing | noreferencecollapsing
关闭 关闭 关闭 开启 -qlanglvl=rightanglebracket | norightanglebracket
关闭 关闭 关闭 开启 -qlanglvl=rvaluereferences | norvaluereferences
关闭 关闭 关闭 开启 -qlanglvl=scopedenum | noscopedenum
关闭 关闭 关闭 开启 -qlanglvl=static_assert | nostatic_assert
关闭 关闭 关闭 开启 -qlanglvl=tempsaslocals | notempsaslocals
关闭 关闭 关闭 关闭 -qlanglvl=textafterendif | notextafterendif
关闭 关闭 关闭 关闭 -qlanglvl=trailenum | notrailenum 开启 关闭 开启 开启 -qlanglvl=typedefclass | notypedefclass 开启 关闭 开启 开启 -qlanglvl=noucs | nonoucs 关闭 关闭 关闭 关闭 -qlanglvl=varargmacros | novarargmacros 关闭 关闭 开启 开启 -qlanglvl=可变[模板] | 不可变[模板]
关闭 关闭 关闭 开启 -qlanglvl=zeroextarray | nozeroextarray 关闭 关闭 开启 开启
C 语言程序 的参数
- c89 | c90 | iso9899:1990
- 编译严格符合 ANSI C89 标准,也称为 ISO C90。
- iso9899:199409
- 编译严格符合 ISO C95 标准。
- c99 | c9x | iso9899:1999 | iso9899:199x
- 编译严格符合 ISO C99 标准,也称为 ISO C99。
c11 | c1x | iso9899:2011
- 编译严格遵循 ISO C11 标准。
- gnu89 | gnu90
- 编译符合 ANSI C89 标准,并接受特定于实现的语言扩展,也称为 GNU C90。
- gnu99 | gnu9x
- 编译符合 ISO C99 标准,并接受特定于实现的语言扩展,也称为 GNU C99。
- gnu11
- 编译符合 ISO C11 标准,并接受特定于实现的语言扩展,也称为 GNU C11。
- stdc89
- 编译严格符合 ANSI C89 标准,也称为 ISO C90。
- extc89
- 编译符合 ANSI C89 标准,并接受特定于实现的语言扩展。
- stdc99
- 编译严格符合 ISO C99 标准。
- extc99
- 编译符合 ISO C99 标准,并接受特定于实现的语言扩展。
- 扩展
- 编译基于 ISO C89 标准,但存在一些差异以适应扩展语言功能。
stdc11
- 编译严格遵循 ISO C11 标准。
extc1x
- 编译基于 C11 标准,调用当前支持的所有 C11 功能以及其他特定于实现的语言扩展。
-qlanglvl 子选项 | 映射到 -std 子选项 |
---|---|
stdc89 | c89 | c90 | iso9899:1990 |
extc89 | gnu89 | gnu90 |
stdc99 | c99 | c9x | iso9899:1999 | iso9899:199x |
extc99 | gnu99 | gnu9x |
stdc11 | c11 | c1x | iso9899:2011 |
extc1x | gnu11 |
C++ 语言程序的参数
- gnu++98 | gnu++03
- 编译基于 ISO C++98 标准,为适应扩展语言功能而进行了少许改动。
- c++98 | c++03
- 编译严格符合 ISO C++98 标准,也称为 ISO C++98。
c++11 | c++0x
- 编译严格遵循 ISO C++11标准及其修订版,也称为ISO C++11。
gnu++11 | gnu++0x
- 编译基于 ISO C++11标准 ,但为了适应扩展语言功能,存在一些差异。
c++14
- 本汇编严格遵照ISO C++14 标准 及其修订版,也称为ISO C++14。
gnu++14
- 编译基于ISO C++14 标准, 并针对扩展语言功能进行了部分修改。
- 扩展
- 编译基于 ISO C++ 标准,为适应扩展语言功能而进行了少许改动。
extended0x
- 编译基于 ISO C++11 标准,具有一些差异以适应扩展语言功能。
表 1 提供有关受支持功能的详细信息。 有关 C++11 功能部件的更多信息,请参阅 Extensions for C++11 compatibility
-qlanglvl 子选项 | 映射到 -std 子选项 |
---|---|
extended | gnu++98 | gnu++03 |
extended0x | gnu++11 | gnu++0x |
C 语言程序的参数

- 经典
- Allows the compilation of nonstandard programs, and conforms closely to the K&R level preprocessor. AIX® V5.1 和更高版本的系统头文件 (例如 math.h) 不支持此语言级别。 如果使用 AIX V5.1 或更高版本的系统头文件,请考虑将程序编译为 stdc89 或 扩展 语言级别。
extc1x
编译基于 C11 标准,调用当前支持的所有 C11 功能部件和其他特定于实现的语言扩展。
有关这些 C11 功能的更多信息,请参阅 Extensions for C11 compatibility
- extc89
- 编译符合 ANSI C89 标准,并接受特定于实现的语言扩展。
- extc99
- 编译符合 ISO C99 标准,并接受特定于实现的语言扩展。
- 扩展
- 提供与 RT 编译器 和 经典的兼容性。 此语言级别 基于 C89。
- SAA
- 编译符合当前 SAA C CPI 语言定义。 当前为 SAA C 级别 2。
- saal2
- 编译符合 SAA C 级别 2 CPI 语言定义,但有一些例外。
- stdc89
- 编译严格符合 ANSI C89 标准,也称为 ISO C90。
- stdc99
- 编译严格符合 ISO C99 标准。注: 并非所有操作系统发行版都支持 C99所需的头文件和运行时库。
- feature_suboption
- 语法图中的 feature_suboption 表示 C 选项的冒号分隔列表。 它们可以是下列任何选项:
textafterendif | notextafterendif
- 指定是否禁止在将代码从允许
#endif
或#else
之后的额外文本的编译器移植到 IBM XL C/C++ 编译器时发出的警告消息。 缺省选项为 -qlanglvl=notextafterendif,表示如果#else
或#endif
后跟任何无关文本,那么将发出消息。 然而,当语言级别为经典时 ,默认选项为 -qlanglvl=textafterendif ,因为此语言级别允许在#else
或#endif
后添加额外文本,而不会生成消息。 - ucs | noucs (仅选项)
- 控制是否允许在程序源代码中的标识,字符串字面值和字符字面值中使用 Unicode 字符。 缺省情况下,当 stdc99 或 extc99 生效时,将启用此子选项。 有关 Unicode 字符集的详细信息,请参阅 Unicode 标准 。
- [no] gnu_assert
- GNU C 可移植性选项。
- [no] gnu_explicitregvar
- GNU C 可移植性选项。
- [no] gnu_include_next
- GNU C 可移植性选项。
- [no] gnu_locallabel
- GNU C 可移植性选项。
- [no] gnu_warning
- GNU C 可移植性选项。
C++ 语言程序的参数

- compat366
- 编译符合某些 IBM C++ 编译器 V3.6 功能部件,但并非所有这些功能部件都符合这些功能部件。
- strict98
- 编译严格符合 ISO C++ 标准。
- 扩展
- 编译基于 ISO C++ 标准,为适应扩展语言功能而进行了少许改动。
extended0x
- 编译基于 C++11 标准,调用大多数 C++ 功能和当前支持的所有 C++11 功能。 表 1#opt_langlvl__langlvl_default_setting_linux 提供有关受支持功能部件的详细信息。 有关 C++11 功能的更多信息,请参阅 C++11 兼容性扩展
- feature_suboption
- 语法图中的 feature_suboption 表示剩余 C++ 选项的冒号分隔列表。 它们可以是下列任何一项:
- anonstruct | noanonstruct
- 启用或禁用对匿名结构和类的支持。 匿名结构通常在并集中使用,如以下代码片段中所示:
当缺省值 -qlanglvl=anonstruct生效时,支持匿名结构。union U { struct { int i:16; int j:16; }; int k; } u; // ... u.j=3;
这是 C++ 标准的扩展,提供旨在与 Microsoft Visual C++ 兼容的行为。指定 -qlanglvl=noanonstruct 以符合标准 C++。
- anonunion | noanonunion
- 控制匿名联合中允许的成员。 当缺省值 -qlanglvl=anonunion生效时,匿名联合可以具有标准 C++ 在非匿名联合中允许的所有类型的成员。 例如,允许非数据成员,例如,结构, typedefs 和枚举。 具有非平凡缺省构造函数,复制构造函数或析构函数的类的成员函数,虚拟函数或对象不能是 union 的成员,而不考虑此选项的设置。
这是对标准 C++ 的扩展,提供了旨在与 先前版本的 VisualAge® C++ 和先行产品以及 Microsoft Visual C++. 指定 -qlanglvl=noanonunion 以符合标准 C++ 的行为。
- ansifor | noansifor
- 控制 C++ 标准中定义的作用域规则是否适用于
for
循环初始化语句中声明的名称。 当缺省值 -qlanglvl=ansifor生效时,将使用标准 C++ 规则,并且以下代码会导致名称查找错误:
错误原因是{ //... for (int i=1; i<5; i++) { cout << i * 2 << endl; } i = 10; // error }
i
或for
循环初始化语句中声明的任何名称仅在for
语句中可视。 要更正错误,请在循环外部声明i
或设置 noansifor。当 -qlanglvl=noansifor 生效时,将使用旧的语言行为; 指定 -qlanglvl=noansifor 以与 较早版本的 VisualAge C++ 和先行产品以及 Microsoft Visual C++ 兼容。
- ansisinit | noansisinit
- 控制标准 C++ 规则是否适用于处理全局对象和静态对象的静态析构函数。 当缺省值 -qlanglvl=ansisinit生效时,将使用标准规则。
当 -qlanglvl=noansisinit 生效时,将使用旧语言行为; 指定 -qlanglvl=noansisinit 以与较早版本的 VisualAge C++ 和先行产品兼容。
自动套用扣减| 不自动套用扣减
- 控制是否启用自动类型扣除功能。 指定 -qlanglvl=autotypededuction 选项时,将启用自动类型扣除功能,您不再需要在声明变量时指定类型。 相反,编译器会从其初始化方法表达式的类型中推断 auto 变量的类型。您还可以使用 -qlanglvl=autotypededuction 选项来控制尾部返回类型功能。 当声明以下类型的模板和函数时,此功能很有用:
- 其返回类型取决于函数参数类型的函数模板或类模板的成员函数
- 具有复杂返回类型的函数或类的成员函数
- 完美的转发函数
-qlanglvl=autotypededuction 选项包含在组选项 -qlanglvl=extended0x中,因此您还可以使用此组选项来启用自动类型扣除功能。
缺省选项为 -qlanglvl=noautotypededuction。
- c1xnoreturn | noc1xnoreturn
启用或禁用对
_Noreturn
函数说明符的支持。-qlanglvl=c1xnoreturn 选项包含在组选项 -qlanglvl=extended 和 -qlanglvl=extended0x中,因此您还可以使用这些组选项来启用
_Noreturn
函数说明符。缺省选项为 -qlanglvl=noc1xnoreturn。
- c99__func__ | noc99__func__
- 启用或禁用对 C99
__func__
标识的支持。 有关此功能的详细信息,请参阅 __func__ 预定义标识 。 - c99complex | noc99complex
- 启用或禁用 C99 复杂数据类型和相关关键字。
- c99complexheader | noc99complexheader
- 启用或禁用 C99 complex.h 头文件。
- c99compoundliteral | noc99compoundliteral
- 启用或禁用对 C99 复合文字的支持。
- c99hexfloat | noc99hexfloat
- 启用或禁用对 C99-style 十六进制浮动常量的支持。
c99longlong | noc99longlong
- 控制是否启用 C99
long long
功能部件。 指定 -qlanglvl=c99longlong 选项时, C++ 编译器将提供 C99long long
功能,这将提高 C 和 C++ 语言之间的源代码兼容性。-qlanglvl=c99longlong 选项与 -qlonglong 选项冲突。 如果同时指定这两个选项,那么将忽略 -qlonglong 选项。 有关 -qlonglong 选项的更多信息,请参阅 -qlonglong。
-qlanglvl=c99longlong 选项包含在组选项 -qlanglvl=extended0x中,因此您还可以使用此组选项来启用 C99
long long
功能部件。缺省选项为 -qlanglvl=noc99longlong。
c99preprocessor | noc99preprocessor
- 控制是否启用 C++11 中采用的 C99 预处理器功能。 当 -qlanglvl=c99preprocessor 生效时, C99 和 C++11 编译器提供了更常见的预处理器接口,这可以简化将 C 源文件移植到 C++ 编译器的过程,并避免预处理器兼容性问题。
缺省选项为 -qlanglvl=noc99preprocessor。
注: 指定 -qlanglvl=c99preprocessor 隐式设置 -qlanglvl=varargmacros。 此外,指定 -qlanglvl=noc99preprocessor 隐式设置 -qlanglvl=novarargmacros。-qlanglvl=c99preprocessor 选项包含在组选项 -qlanglvl=extended0x中,因此您还可以使用此组选项来启用 C99 预处理器功能。
- c99vla | noc99vla
- 启用或禁用对 C99-type 变长数组的支持。
兼容性价值绑定 | 不兼容性价值绑定
- C++ 标准 (2003) 指示 rvalue 只能绑定到 const 非易失性 lvalue reference。 不合规的编译器可能允许将 非 const 或 volatile lvalue 引用 绑定到 rvalue。 当您将代码移植到 IBM XL C/C++ 编译器时,您可以指定此选项,以指示编译器允许非常量或易失性左值引用绑定到用户定义类型的右值,而无需初始化器。
如果 和 选项都有效,编译器会发出错误信息。 -qlanglvl=compatrvaluebinding -qlanglvl=rvaluereferences
- 同胞 | no同胞
- 控制零扩展数据块数组是具有底层维度 1 还是 0。 当缺省值 -qlanglvl=nocompatzea生效时,零扩展数据块数组的维数为 0。 使用 -qlanglvl=compatzea 来指定零扩展数据块数组具有维 1,以便与使用 VisualAge C++ V6.0 和先行产品编译的代码兼容。 仅当 -qlanglvl=zeroextarray 也生效时,指定 -qlanglvl=compatzea 才有效。
复杂性 | 非复杂性
- 控制 C++ 编译器是否使用 C99 复杂类型的 C11 样式初始化。
-qlanglvl=complexinit 选项包含在组选项 -qlanglvl=extended 和 -qlanglvl=extended0x中,因此您还可以使用这些组选项来启用复杂类型的初始化。 在这种情况下,请指定 -qlanglvl=c99complexheader ,以便编译器可以使用正确的头文件。
默认选项为 -qlanglvl=complexinit。
constexpr | noconstexpr
- 控制是否启用广义常量表达式功能。 指定 -qlanglvl=constexpr 选项时,编译器将扩展常量表达式中允许的表达式。 常量表达式是可以在编译时进行求值的表达式。
-qlanglvl=constexpr 选项包含在组选项 -qlanglvl=extended0x中,因此您还可以使用此组选项来启用通用化常量表达式功能。
缺省选项为 -qlanglvl=noconstexpr。
decltype | nodecltype
- 控制是否启用
decltype
功能部件。 通过此功能,您可以获取基于可能与类型相关的表达式的结果类型的类型。 要启用此功能,可以指定 -qlanglvl=decltype 选项。-qlanglvl=decltype 选项包含在组选项 -qlanglvl=extended0x中,因此您还可以使用此组选项来启用
decltype
功能部件。缺省选项为 -qlanglvl=nodecltype。
默认和删除 | 默认和删除
- 控制是否启用缺省和已删除的功能部件。 通过此功能,您可以定义显式缺省函数,这些函数的实现由编译器生成,以实现更高的效率。 您还可以定义其用法被编译器禁用的已删除函数,以避免调用不需要的函数。 要启用此功能,可以指定 -qlanglvl=defaultanddelete 选项。
-qlanglvl=defaultanddelete 选项包含在组选项 -qlanglvl=extended0x中,因此您还可以使用此组选项来启用此功能。
缺省选项为 -qlanglvl=nodefaultanddelete。
委托人 | 委托人
- 控制是否启用委派构造函数功能。 通过此功能,您可以集中在一个构造函数中的公共初始化和后初始化,这可以使程序更易于读取和维护。 要启用此功能,可以指定 -qlanglvl=delegatingctors 选项。
-qlanglvl=delegatingctors 选项包含在组选项 -qlanglvl=extended0x中,因此您还可以使用此组选项来启用委派构造函数功能。
缺省选项为 -qlanglvl=nodelegatingctors。
- DependentBaseLookup | noDependentBaseLookup
- 控制是否应用 C++ 标准的技术更正 1 (TC1) 中定义的从属类型的模板基类的名称查找规则。 指定 -qlanglvl=noDependentBaseLookup 以符合 TC1。 当 -qlanglvl=noDependentBaseLookup 生效时,如果模板类中的非限定名依赖于模板参数,那么将不会在基类中解析该基类。 必须使用基类名对这些名称进行限定,才能通过名称查找找到这些名称。 当缺省值 -qlanglvl=DependentBaseLookup生效时,将保留先前 XL C++ 编译器的行为。注: 缺省选项为 C++11 语言级别的 -qlanglvl=noDependentBaseLookup 。以下示例显示了未使用 -qlanglvl=noDependentBaseLookup进行编译的代码:
struct base { int baseName; }; template <class B> struct derived : public B { void func() { int i = baseName; // this name will not be found in the base class }; }; int main(void) { derived<base> x; x.func(); return 0; }
以下示例显示了使用或不使用 -qlanglvl=nodependentbaselookup进行编译的代码:struct base { int baseName; }; template <class B> struct derived : public B { void func() { int i = B::baseName; // qualified name will be found in the base class }; }; int main(void) { derived<base> x; x.func(); return 0; }
- empty_struct | noempty_struct
- 此选项指示编译器在结构中容许空成员声明。 不
允许结构中的空成员声明。 例如,当 -qlanglvl=noemptystruct 生效时,编译器将拒绝以下示例:
struct S { ; // this line is ill-formed };
缺省值为 -qlanglvl=noemptystruct。
显式转换运算符 | 无显式转换运算符
- 控制是否启用显式转换运算符功能。 指定 -qlanglvl=explicitconversionoperators 选项时,可以将
explicit
函数说明符应用于用户定义的转换函数的定义,从而通过用户定义的转换函数来禁止意外的隐式转换。-qlanglvl=explicitconversionoperators 选项包含在组选项 -qlanglvl=extended0x中,因此您还可以使用此组选项来启用显式转换运算符功能。
缺省选项为 -qlanglvl=noexplicitconversionoperators。
扩展好友 | 非扩展好友
- 控制是否启用扩展友元声明功能。 当您指定 -qlanglvl=extendedfriend 选项时,控制友元声明的规则将按如下所示进行放宽:
- 可以将模板参数、
typedef
名称和基本类型声明为友元。 - 友元声明上下文中的类关键字在 C++11 中不再是必要的。
-qlanglvl=extendedfriend 选项包含在组选项 -qlanglvl=extended0x中,因此您还可以使用此组选项来启用扩展友元声明功能。
缺省选项为 -qlanglvl=noextendedfriend。
注: -qlanglvl=extendedfriend 与 -qlanglvl=oldfriend 选项不兼容。 当 -qlanglvl=extendedfriend 生效时,将忽略 -qlanglvl=oldfriend 选项,并且 -qlanglvl=[no]oldfriend 的设置为 -qlanglvl=nooldfriend。 - 可以将模板参数、
扩展整数安全 | 无扩展整数安全
- 通过此选项,如果没有包含
u
或U
的后缀的十进制整数字面值无法由long long int
类型表示,那么您可以决定是否使用unsigned long long int
类型来表示该字面值。仅当指定了 -qlanglvl=c99longlong 选项时,此选项才会生效,否则,编译器将发出警告消息以指示该选项已被忽略。 当您同时指定 -qlanglvl=c99longlong 和 -qlanglvl=extendedintegersafe 选项时,如果没有包含
u
或U
的后缀的十进制整数文字不能由long long int
类型表示,那么编译器会发出一条错误消息,指出该文字的值超出范围。在所有语言级别中,缺省选项为 -qlanglvl=noextendedintegersafe 。
外部模板 | 无外部模板
- 控制是否启用显式实例化声明功能。 通过此功能,您可以禁止模板特殊化或其成员的隐式实例化。 要启用此功能,可以指定 -qlanglvl=externtemplate 选项,这是缺省选项。
-qlanglvl=externtemplate 选项包含在 -qlanglvl=extended 和 -qlanglvl=extended0x的组选项中,因此您可以使用这两个组选项来启用此功能。
下表列出了与 -qlanglvl=externtemplate 选项交互的选项:下表列出了与 -qlanglvl=externtemplate 选项交互的 IBM 语言扩展:表 4。 与 -qlanglvl=externtemplate 交互的选项 选项 描述 -qtemplatereg化学, -qtempinc 显式实例化声明仍然有效。 引用的特殊化是显式实例化声明的主体,但不是转换单元中显式实例化定义的主体不会从该转换单元实例化或由于该转换单元而实例化。 表 5。 与 -qlanglvl=externtemplate 交互的 IBM 语言扩展 IBM 语言扩展 描述 #pragma 实例化 此编译指示在语义上与显式实例化定义相同。 #pragma do_not_instantiate 此编译指示提供 C++11 标准中引入的显式实例化声明的功能子集。 仅出于向后兼容性目的而提供。 新应用程序可以使用显式实例化声明。 #pragma hashome 和 #pragma ishome 此编译指示导致为类模板特殊化生成虚拟函数表 (VFT) ,而不考虑特殊化的显式实例化声明。 -qlanglvl=[no]externtemplate 选项将替换不推荐使用的 -qlanglvl=[no]gnu_externtemplate 选项。 在应用程序中使用 -qlanglvl=[no]externtemplate 选项。
- FileScopeConstExternLinkage | noFileScopeConstExternLinkage
- 控制当未指定静态或外部关键字时,常量变量的文件作用域是具有内部还是外部链接。
当 -qlanglvl=FileScopeConstExternLinkage 生效时,所有文件作用域常量变量都将标记为外部可视。 否则,所有文件作用域常量变量都将标记为静态。
缺省值为 -qlanglvl=noFileScopeConstExternLinkage。
- gnu_assert | nognu_assert
- 启用或禁用对以下 GNU C 系统标识断言的支持:
- #assert
- #unassert
- #cpu
- #machine
- #system
- gnu_complex | nognu_complex
- 启用或禁用 GNU 复杂数据类型和相关关键字。
- gnu_computedgoto | nognu_computedgoto
- 启用或禁用对已计算的
goto
语句的支持。 - gnu_externtemplate | nognu_externtemplate
- 启用或禁用
extern
模板实例化。 有关此功能的详细信息,请参阅 显式实例化 。注: 在 XL C/C++ 16.1中不推荐使用选项 -qlanglvl=[no]gnu_externtemplate ; 您可以改为使用选项 -qlanglvl=[no]externtemplate 。 - gnu_include_next | nognu_include_next
- 启用或禁用对 GNU C
#include_next
预处理器伪指令的支持。 - gnu_labelvalue | nognu_labelvalue
- 启用或禁用对作为值的标签的支持。
- gnu_locallabel | nognu_locallabel
- 启用或禁用对本地声明的标签的支持。
- gnu_membernamereuse | nognu_membernamereuse
- 启用或禁用将成员列表中的模板名称复用为
typedef
。 - gnu_suffixij | nognu_suffixij
- 启用或禁用对 GNU 样式的复数的支持。 当 -qlanglvl=gnu_suffixij 生效时,可以使用后缀 i/I 或 j/J 结束复数。
- gnu_varargmacros | nognu_varargmacros
- 启用或禁用对具有变量自变量的 GNU 样式宏的支持。
- gnu_warning | nognu_warning
- 启用或禁用对 GNU C
#warning
预处理器伪指令的支持。 - illptom | noillptom
- 控制可用于形成指向成员的指针的表达式。 当缺省值 -qlanglvl=illptom生效时, XL C++ 编译器接受一些常用但不符合 C++ 标准的格式。 例如,以下代码定义指向函数成员
p
的指针,并以旧样式将其初始化为C::func
的地址:struct C { void func(int); }; void (C::*p) (int) = C::func;
这是对标准 C++ 的扩展,提供了旨在与 较早版本的 VisualAge C++ 及其先行产品以及 Microsoft Visual C++ 兼容的行为。
指定 -qlanglvl=noillptom 以符合 C++ 标准。 必须修改上面的示例代码以使用
&
运算符。struct C { void func(int); }; void (C::*p) (int) = &C::func;
- implicitint | noimplicitint
- 控制编译器是接受缺失类型还是部分指定类型作为隐式指定
int
。 当缺省值 -qlanglvl=implicitint生效时,将隐式声明名称空间作用域或成员列表中的函数声明以返回int
。 此外,未完全指定类型的任何声明说明符序列都将隐式指定整数类型。 效果就像int
说明符存在一样。以下说明符未完全指定类型:
- 自动
- const
- extern
- extern "字面值"
- 直接插入
- 可变的
- 友元
- 注册
- 静态
- typeDef
- 虚拟
- 易变变量
- 特定于平台的类型
C++11 已删除将 auto 用作存储类指定符。 在 C++11中,关键字 auto 用作类型说明符。 编译器从其初始化方法表达式的类型推断 auto 变量的类型。 更多信息,请参阅汽车类型说明( C++11 )。
例如,函数
MyFunction
的返回类型为int
,因为在以下代码中省略了该函数:MyFunction() { return 0; }
请注意,指定类型的任何情境都受此子选项影响。 例如,这包括模板和参数类型,异常规范,表达式中的类型 (例如,
casts, dynamic_cast, new
) 以及转换函数的类型。这是 C++ 标准的扩展,提供了旨在与 较早版本的 VisualAge C++ 和先行产品以及 Microsoft Visual C++ 兼容的行为。
指定 -qlanglvl=noimplicitint 以符合标准 C++。例如,必须将上面的函数声明修改为:
int MyFunction() { return 0; }
inlinenamespace | noinlinenamespace
- 控制是否启用内联名称空间定义,这些定义是以初始
inline
关键字开头的名称空间定义。 如此定义的名称空间是内联名称空间。 当您指定 -qlanglvl=inlinenamespace 选项时,可以定义内联名称空间的成员并使其成为专用成员,就像它们也是外层名称空间的成员一样。-qlanglvl=inlinenamespace 选项包含在组选项 -qlanglvl=extended0x中,因此您还可以使用此组选项来启用内联名称空间定义功能。
缺省选项为 -qlanglvl=noinlinenamespace。
- newexcp | nonewexcp
- 控制
new
操作程序在请求的内存发生故障时是否抛出异常。 当缺省值 -qlanglvl=nonewexcp生效时,将返回空指针 0。 当 -qlanglvl=newexcp 生效时,将抛出标准异常std::bad_alloc
。 要与较早版本的 VisualAge C++ 和先行产品兼容,请指定 -qlanglvl=nonewexcp。 要符合完全支持new
异常的 C++ 标准,请指定 -qlanglvl=newexcp。此子选项不适用于
new
操作程序的nothrow
版本,具有空throw
规范的new
操作程序,特定于类的new
操作程序以及具有放置参数的new
操作程序。注: 您还可以使用等效的 #pragma operator_new 伪指令为所选代码部分指定此子选项。 请参阅 #pragma operator_new (仅限 C + +) 以获取详细信息。 空指针 | 非空指针
- 控制是否启用
nullptr
功能部件。 具有nullptr
值的空指针可以转换为任何指针类型,指针到成员类型或 bool 类型。 对于超负荷函数,nullptr
常量可与整数 0 区分开。-qlanglvl=nullptr 选项包含在组选项 -qlanglvl=extended0x中; 您还可以使用此组选项来启用
nullptr
关键字功能。缺省选项为 -qlanglvl=nonullptr。
- offsetnonpod | nooffsetnonpod
- 控制是否可以将
offsetof
宏应用于并非仅数据的类。 C++ 程序员经常随便调用纯数据类 "Plain Old Data" (POD) 类。 当缺省值 -qlanglvl=offsetnonpod生效时,可以将offsetof
应用于包含下列其中一项的类:- 隐式声明或
明确默认的
构造函数或析构函数
- 默认声明或
明确默认
赋值运算符
- 专用或受保护的非静态数据成员
- 基类
- 虚拟函数
- 类型为指向成员的指针的非静态数据成员
- 具有非数据成员的结构或并集
- 参考
这是 C++ 标准的扩展,并提供了旨在与 VisualAge C++ for OS/2 3.0, VisualAge for C++ for Windows , V3.5和 Microsoft Visual C++ 兼容的行为。指定 -qlanglvl=nooffsetnonpod 以符合标准 C + +。
- 隐式声明或
- olddigraph | noolddigraph
- 启用或禁用对旧式摘要的支持。 当缺省值 -qlanglvl=olddigraph生效时,不支持旧样式的摘要。 当 -qlanglvl=olddigraph 生效时,支持以下摘要:
- 迪格拉普
- 生成的字符
- %%
- #(井号)
- %%%%
- ## (双磅符号,用作预处理器宏并置运算符)
指定 -qlanglvl=noolddigraph 以兼容标准 C++ 以及先前版本的 VisualAge C++ 和先行产品所支持的扩展 C++ 语言级别。
仅当 -qdigraphs 生效时,此子选项才有效。
- oldfriend | nooldfriend
- 控制是否将没有详细类名的名称类的友元声明视为 C++ 错误。 当缺省值 -qlanglvl=oldfriend生效时,您可以声明友元类而不使用关键字
class
阐述类的名称。 例如,下面的语句将类IFont
声明为友元类:friend IFont;
这是 C++ 标准的扩展,提供了旨在与 较早版本的 VisualAge C++ 和先行产品以及 Microsoft Visual C++ 兼容的行为。
指定 -qlanglvl=nooldfriend 以符合标准 C++。 以上示例声明必须修改为以下内容:
friend class IFont;
注: -qlanglvl=oldfriend 与 -qlanglvl=extendedfriend 选项不兼容。 当 -qlanglvl=extendedfriend 生效时,将忽略 -qlanglvl=oldfriend 选项,并且 -qlanglvl=[no]oldfriend 的设置为 -qlanglvl=nooldfriend。 - oldmath | nooldmath
- 控制当您将 math.h 指定为包含的源文件或主源文件时包含的 math.h 中数学函数声明的版本。
指定 -qlanglvl=nooldmath 以严格遵守 C++ 标准。 指定 -qlanglvl=oldmath 以与较早版本的 VisualAge C++ 和先行产品兼容。
- oldtempacc | nooldtempacc
- 控制是否始终检查对用于创建临时对象的副本构造函数的访问,即使避免创建临时对象也是如此。 当缺省值 -qlanglvl=oldtempacc生效时,将禁止访问检查。这是 C++ 标准的扩展,并提供了旨在与 VisualAge C++ for OS/2 3.0, VisualAge for C++ for Windows , V3.5和 Microsoft Visual C + + 兼容的行为。指定 -qlanglvl=nooldtempacc 以符合标准 C + +。例如,以下代码中的
throw
语句会导致错误,因为副本构造函数是 C 类的受保护成员:class C { public: C(char *); protected: C(const C&); }; C func() {return C("test");} // return copy of C object
上面的示例代码包含副本构造函数void f() { // catch and throw both make implicit copies of // the throw object throw C("error"); // throw a copy of a C object const C& r = func(); // use the copy of a C object // created by func() }
C(const C&)
的三种格式不正确的用法。 - oldtmplalign | nooldtmplalign
- 控制是否忽略为嵌套模板指定的对齐规则。 当缺省值 -qlanglvl=nooldtmplalign生效时,不会忽略这些对齐规则。 例如,给定以下模板的大小A<char>::B将为 5 (含 -qlanglvl=nooldtmplalign) 和 8 (含 -qlanglvl=oldtmplalign):
指定 -qlanglvl=oldtmplalign 以与 VisualAge for C++ V4.0 和先行产品兼容。template <class T> struct A { #pragma options align=packed struct B { T m; int m2; }; #pragma options align=reset };
- oldtmplspec | nooldtmplspec
- 控制是否允许不符合 C++ 标准的模板特殊化。 当缺省值 -qlanglvl=oldtmplspec生效时,您可以显式地专门化模板类,如以下示例中所示,该示例专门化类型
char
的模板类ribbon
:
这是对标准 C++ 的扩展,提供了旨在与 VisualAge C++ for OS/2 3.0, VisualAge for C++ for Windows , V3.5和 Microsoft Visual C++ 兼容的行为。template<class T> class ribbon { /*...*/}; class ribbon<char> { /*...*/};
指定 -qlanglvl=nooldtmplspec 以符合标准 C + +。在以上示例中,必须将模板特殊化修改为:
template<class T> class ribbon { /*...*/}; template<> class ribbon<char> { /*...*/};
- redefmac | noredefmac
- 控制是否可以在不使用先前
#undef
或undefine()
语句的情况下重新定义宏。 参考资料 收起 | 参考资料 收起
- 控制是否启用引用折叠功能。 要启用此功能,请指定 -qlanglvl=referencecollapsing 选项。
-qlanglvl=referencecollapsing 选项包含在组选项 -qlanglvl=extended0x中,因此您还可以使用此组选项来启用引用折叠功能。
当 -qlanglvl=rvaluereferences 选项生效,但 -qlanglvl=referencecollapsing 选项未生效时,编译器的行为就像指定了 -qlanglvl=referencecollapsing 选项一样。
缺省选项为 -qlanglvl=noreferencecollapsing。
右括号 | 无右括号
- 控制是否启用直角支架功能。 要启用此功能,可以指定 -qlanglvl=rightanglebracket 选项。
-qlanglvl=rightanglebracket 选项包含在组选项 -qlanglvl=extended0x中,因此您还可以使用此组选项来启用直角括号功能。
缺省选项为 -qlanglvl=norightanglebracket。
有价值的参考资料 | 没有价值的参考资料
- 控制是否启用 rvalue 引用功能。 要启用此功能,请指定 -qlanglvl=rvaluereferences 选项。
-qlanglvl=rvaluereferences 选项包含在组选项 -qlanglvl=extended0x中,因此您还可以使用此组选项来启用 rvalue 引用功能。
如果 -qlanglvl=compatrvaluebinding 和 -qlanglvl=rvaluereferences 选项都生效,那么编译器将发出错误消息。
缺省选项为 -qlanglvl=norvaluereferences。
scopedenum | noscopedenum
- 控制是否启用限定范围的枚举功能。 要启用此功能,可以指定 -qlanglvl=scopedenum 选项。
-qlanglvl=scopedenum 选项包含在组选项 -qlanglvl=extended0x中,因此您还可以使用此组选项来启用限定范围的枚举功能。
缺省选项为 -qlanglvl=noscopedenum。
静态断言 | 静态断言
- 控制是否启用静态断言功能。 当 -qlanglvl=static_assert 生效时,此功能可用于生成在发生故障时发出严重错误消息的编译时断言。
tempsaslocals | notempsaslocals
- C++ 语言标准描述了临时对象 [class.temporary] 部分中的临时生存期。 当您从实施延迟临时破坏的编译器移植应用程序时,可能需要延长 C++ 语言标准中指定的 C++ 临时变量的生命周期。 此选项将延长临时值的生存期,以降低迁移难度。
textafterendif | notextafterendif
- 指定是否禁止将代码从允许
#endif
或#else
之后的额外文本的编译器移植到 IBM XL C/C++ 编译器时发出的警告消息。 缺省选项为 -qlanglvl=notextafterendif,表示如果#else
或#endif
后跟任何无关文本,那么将发出消息。 - trailenum | notrailenum
- 控制
enum
声明中是否允许使用尾部逗号。 当缺省值 -qlanglvl=trailenum生效时,在枚举符列表的末尾允许使用尾部逗号。 这是 C99 功能部件。 它也由 C++11 标准采用。 以下示例在 -qlanglvl=trailenum 生效时有效:enum grain {wheat, barley, rye,};
- typedefclass | notypedefclass
- 控制是否可以在期望类名的位置指定 typedef 名称。 当缺省值 -qlanglvl=typedefclass生效时,将应用标准 C++ 规则,并且不能在期望类名的位置指定 typedef 名称。 指定 -qlanglvl=typedefclass 以允许在基本说明符和构造函数初始化方法列表中使用 typedef 名称,以便与先前版本的 VisualAge for C++ 和先行产品兼容。
- ucs | noucs
- 控制是否允许在程序源代码中的标识,字符串字面值和字符字面值中使用 Unicode 字符。 有关 Unicode 字符集的详细信息,请参阅 Unicode 标准 。
- varargmacros | novarargmacros
- 在类似函数的宏中启用或禁用对 C99-style 变量自变量列表的支持。注: 指定 -qlanglvl=c99preprocessor 隐式设置 -qlanglvl=varargmacros。 反之亦然,指定 -qlanglvl=noc99preprocessor 隐式设置 -qlanglvl=novarargmacros。有关此功能的详细信息,请参阅 类似于函数的宏 。
可变模板 | 不可变模板
- 控制是否启用 "可变模板" 功能。 通过此功能,您可以定义具有任意数目 (包括零) 参数的类和函数模板。 要启用此功能,可以指定 -qlanglvl=variadic[templates] 选项。 方括号中包含的词 templates 是可选的。 如果仅指定 -qlanglvl=variadic 选项,那么编译器将假定已指定 -qlanglvl=variadictemplates 选项。
-qlanglvl=variadic[templates] 选项包含在组选项 -qlanglvl=extended0x中,因此您还可以使用此组选项来启用变体模板功能。
缺省选项为 -qlanglvl=novariadic[templates]。
- zeroextarray | nozeroextarray
- 控制是否可以使用零扩展数据块数组作为 structure 定义中的最后一个非静态数据成员。 当缺省值 -qlanglvl=zeroextarray生效时,可以使用具有零个元素的数组。 以下语句声明零扩展数据块数组
a
。struct S1 { char a[0]; };
这是 C++ 标准的扩展,旨在提供与 Microsoft Visual C++ 的兼容性。
指定 -qlanglvl=nozeroextarray 以符合标准 C++ 或先前版本的 VisualAge C++ 和先行产品支持的 ANSI 语言级别。
使用量

- [no]c99complex
- [no] gnu_complex

decltype
或 static_assert
含义,则编译器会发出语法错误,但不会发出诊断消息,如果用户碰巧使用 C++11 语法中的 decltype
或 static_assert
。
由于pragma指令会使您的代码不可移植,因此建议您使用该选项,而不是pragma。 如果使用 pragma ,那么它必须出现在源代码中的任何非注释行之前。 此外,由于指令可以动态改变预处理器的行为,因此使用仅预处理选项进行编译可能会产生与常规编译不同的结果。
预定义的宏
请参阅 与语言级别相关的宏 ,以获取 -qlanglvl 子选项预定义的宏的列表。