本节讨论 C 和 C++ 编程语言的实现和 XL C/C++ 所提供的语言扩展。
XL C/C++ 可以鼓励强调可移植性的编程风格。语法和语义构成编程语言的完整规范,但特定语言规范的一致实现可能会由于语言扩展不同而不同。
严格地遵循它的语言规范的程序在不同环境中将具有最大可移植性。从理论上讲,在硬件差异所允许范围内,用一种符合标准的编译器可正确编译并且不使用任何扩展或实现定义的行为的程序将在所有其它符合标准的编译器中正确地进行编译和执行。正确利用语言实现提供的语言扩展的程序可以提高其目标代码的效率。
XL C/C++ 符合“ISO/IEC 国际标准”14882:2003(E),它指定 C++ 编程语言编写的程序的格式并对其作出解释。该国际标准用于提高 C++ 程序在各种实现中的可移植性。ISO/IEC 14882:1998 是第一个 C++ 语言。
“ISO/IEC 9899:1990 国际标准”(也称为 C89)指定用 C 编程语言编写的程序的格式并对其作出解释。设计此规范的目的是为了提升 C 程序在各种实现间的可移植性。此“标准”经历了 ISO/IEC 9899/COR1:1994、ISO/IEC 9899/AMD1:1995 和 ISO/IEC 9899/COR2:1996 这些版本,得到了改进和修正。要确保源代码严格遵循改进和修正后的 C89 标准,应指定 -qlanglvl=stdc89 编译器选项。
“ISO/IEC 9899:1999 国际标准”(也称为 C99)是对用 C 编程语言编写的程序进行更新以后的标准。它用于增强 C 语言的能力,提供对 C89 的澄清并加入技术更正。XL C/C++ 支持此语言规范的许多功能。
C 编译器支持在“C99
标准”中指定的所有语言功能。要确保源代码遵循此语言功能集,应使用
c99
调用命令。注意,该“标准”还指定运行时库中的功能。这些功能在当前运行时库和操作环境中可能不受支持。系统头文件是否存在说明了这种支持是否存在。
XL C/C++ 实现所有 C99 语言功能。以下是选择的主要功能的表。
对 IBM C 的 ISO/IEC 9899:1999 国际标准扩展 | |
C99 功能 | 相关参考 |
---|---|
指针的 restrict 类型限定符 | The restrict Type Qualifier |
通用字符名称 | The Unicode Standard |
预定义标识 __func__ | Predefined Identifiers |
带有可变数目的自变量和空自变量的拟函数宏 | Function-Like Macros |
_Pragma 一元运算符 | The _Pragma Operator |
可变长度数组 | Variable Length Arrays |
数组下标声明中的 static 关键字 | Arrays |
complex 数据类型 | Complex Types |
long long int 和 unsigned long long int 类型 | Integer Variables |
十六进制浮点常数 | Hexadecimal Floating Constants |
聚集类型的复合文字 | Compound Literals |
指定的初始化函数 | Initializers |
C++ 样式注释 | Comments |
不允许隐式函数声明 | Function Declarations |
混合声明和代码 | The for Statement |
_Bool 类型 | Simple Type Specifiers |
inline 函数声明 | Inline Functions |
聚集的初始化函数 | Initializing Arrays Using Designated Initializers |
C99 标准中的一些规范基于 C89 标准的更改和说明,而不是基于语言的新功能。XL C/C++ 支持所有 C99 语言功能,包括以下功能:
相关参考
还在 C++ 中实现了“ISO/IEC 9899:1999
国际标准”(C99)的某些功能。在指定了 -qlanglvl=extended
编译器选项的情况下,这些扩展可用。
IBM C++ 的 ISO/IEC 9899:1999 国际标准扩展 | |
C99 功能 | 参考 |
---|---|
指针的 restrict 类型限定符 | The restrict Type Qualifier |
通用字符名称 | The Unicode Standard |
预定义标识 __func__ | Predefined Identifiers |
可变长度数组 | Variable Length Arrays |
complex 数据类型 | Complex Types |
十六进制浮点常数 | Hexadecimal Floating Constants |
聚集类型的复合文字 | Compound Literals |
带有可变数目的自变量和空自变量的拟函数宏 | Function-Like Macros 和 Variadic Macro Extensions |
_Pragma 一元运算符 | The _Pragma Operator |
-qlanglvl 编译器选项用于指定受支持的语言级别,因此会影响编译代码的方式。也可以通过使用不同编译器调用命令隐式地指定语言级别。一般情况下,在标准语言级别下正确编译和运行的有效程序在启用垂直扩展后应能继续正确编译和运行并产生相同的结果。
例如,要编译 C 程序以便它们严格符合“ISO/IEC 9899:1990 国际标准(C89)”,需要指定 -qlanglvl=stdc89。stdc89 子选项指示编译器严格遵循该标准,不允许任何语言扩展。(c89 编译器调用命令隐式地指定此语言级别。)
也可以使用标准语言级别的扩展。不影响标准功能的扩展称为垂直扩展。例如,当编译 C 程序时,可以通过指定 -qlanglvl=extc89 启用 C89 的垂直扩展。
“ISO/IEC 9899:1999 国际标准”(C99)中描述的大多数语言功能都被认为是 C89 的垂直扩展。
另一方面,非垂直扩展会影响在某个国际标准中所描述的语言的某些方面或与它们发生冲突。必须通过特定编译器选项显式地启用接受这些扩展。对非垂直扩展的依赖使得将应用程序移植到不同环境更难。
以下列示了 -qlanglvl 选项的主要子选项。
选择的 -qlanglvl 子选项 | |
-qlanglvl 子选项 | 子选项描述 |
---|---|
-qlanglvl=stdc99 |
指定严格遵循 C99 标准。
|
-qlanglvl=stdc89 |
指定严格遵循 C89 标准。
|
-qlanglvl=extc99 |
启用 C99 的所有垂直扩展。
|
-qlanglvl=extc89 |
启用 C89 的所有垂直扩展。
|
-qlanglvl=extended |
启用 C89 的所有垂直扩展并指定 -qupconv
编译器选项。
|
相关参考