为了便于移植使用 GNU C 开发的应用程序或代码,XL C/C++ 支持 C99 和标准 C++ 的 GNU C 和 C++ 语言扩展的一部分。本节中的表列示了受支持的功能、不受支持的功能以及接受其语法但忽略其语义的功能。
要在 C 代码中使用受支持的扩展,请使用 xlc 或 cc 调用命令,或指定 -qlanglvl=extc89、-qlanglvl=extc99 或 -qlanglvl=extended 中的一个。在 C++ 中,缺省情况下,接受所有受支持的 GNU C 和 C++ 功能。
在下列表中,标记为接受/忽略的扩展是编译器认为可以接受的编程关键字,但其 GNU C/C++ 语义不受支持。这意味着当编译器遇到接受/忽略的关键字或扩展时,编译不会停止,但在应用程序中不会实现其 GNU 语义。 在严格的语言级别(stdc89 或 stdc99)下编译使用这些扩展的源代码将导致错误消息。
相关参考
在 GNU 手册(网址为 http://gcc.gnu.org/onlinedocs)中对 GNU C 和 C++ 语言扩展进行了完整的介绍。
当声明或定义函数时使用关键字 __attribute__
来指定特殊属性。此关键字后跟用两个括号括住的属性说明。XL C/C++ 支持 GNU C 和 C++
函数属性的一部分。描述为接受/忽略的行为意味着接受其语法,但是忽略其语义,编译继续进行。
GNU C/C++ 函数属性与 XL C/C++ 的兼容性 | |
函数属性 | 行为 |
---|---|
alias | 支持 |
always_inline | 支持 |
cdecl | 接受/忽略 |
const | 支持 |
constructor | 支持 |
destructor | 支持 |
dllexport | 接受/忽略 |
dllimport | 接受/忽略 |
eightbit_data | 接受/忽略 |
exception | 接受/忽略 |
format | 支持 |
format_arg | 支持 |
function_vector | 接受/忽略 |
interrupt | 接受/忽略 |
interrupt_handler | 接受/忽略 |
longcall | 接受/忽略 |
model | 接受/忽略 |
no_check_memory_usage | 接受/忽略 |
no_instrument_function | 接受/忽略 |
noinline | 支持 |
noreturn | 支持 |
pure | 支持 |
regparm | 接受/忽略 |
section | 支持 |
stdcall | 接受/忽略 |
tiny_data | 接受/忽略 |
weak | 支持 |
相关参考
使用关键字 __attribute__
来指定变量或结构字段的特殊属性。此关键字后跟用两个括号括住的属性说明。XL C/C++ 支持 GNU C 和 C++
变量属性的一部分。描述为接受/忽略的行为意味着接受其语法,但是忽略其语义,编译继续进行。
GNU C/C++ 变量属性与 XL C/C++ 的兼容性 | |
变量属性 | 行为 |
---|---|
aligned | 支持 |
![]() | 支持 |
mode | 支持 |
model | 接受/忽略 |
nocommon | 支持 |
packed | 支持 |
section | 支持 |
transparent_union | 支持 |
unused | 接受/忽略 |
weak | 支持 |
相关参考
当定义 struct 和 union 类型时,使用关键字
__attribute__
来指定这些类型的特殊属性。此关键字后跟用两个括号括住的属性说明。XL C/C++ 支持 GNU C 和 C++
类型属性的一部分。描述为接受/忽略的行为意味着接受其语法,但是忽略其语义,编译继续进行。
GNU C/C++ 类型属性与 XL C/C++ 的兼容性 | |
类型属性 | 行为 |
---|---|
aligned | 支持 |
packed | 支持 |
transparent_union | 支持 |
unused | 接受/忽略 |
相关参考
使用断言来测试已编译程序将在哪一种计算机或系统上运行。预定义了断言
#cpu、#machine 和
#system。也可以使用预处理伪指令 #assert 和
#unassert 来定义断言。
XL C/C++ 中的 GNU C 和 C++ 断言 | |
GNU C 断言 | 行为 |
---|---|
#assert | 支持 |
#unassert | 支持 |
#cpu |
支持可能的值为 powerpc |
#machine |
支持可能的值为 powerpc 和 bigendian |
#system |
支持可能的值为 unix 和 posix |
与 GNU C 和 C++ 相关的下列功能在扩展的语言级别(extc89、extc99 和 extended)下受支持。
在扩展语言级别(extc89、extc99 和 extended)下,XL C/C++ 识别以下功能的语法,但不支持它们的语义。
相关参考
应该指出的是,不是所有 XL C++ 头文件 <cmath> 和 <cstdlib> 中的数学函数都能处理整数类型的自变量。因为在将自变量从整数类型转换为浮点类型时,可能会创建等级相同的多个重载解析。
例如,在 C++ 程序中对一个 unsigned int 或者一个 unsigned long 取绝对值时会导致重载解析错误,即使 XL C++ 实现其头文件中的 abs() 库函数所要求的所有特征符。
甚至在包括 XL 头文件 <math.h> 和
<stdlib.h>
两者后,此问题仍然存在。变通方法是,在函数中使用无符号整数类型的自变量之前先将它强制转换为合适的类型。