与 GNU C 和 C++ 可移植性相关的功能

为了便于移植使用 GNU C 开发的应用程序或代码,XL C/C++ 支持 C99 和标准 C++ 的 GNU C 和 C++ 语言扩展的一部分。本节中的表列示了受支持的功能、不受支持的功能以及接受其语法但忽略其语义的功能。

要在 C 代码中使用受支持的扩展,请使用 xlccc 调用命令,或指定 -qlanglvl=extc89-qlanglvl=extc99-qlanglvl=extended 中的一个。在 C++ 中,缺省情况下,接受所有受支持的 GNU C 和 C++ 功能。

在下列表中,标记为接受/忽略的扩展是编译器认为可以接受的编程关键字,但其 GNU C/C++ 语义不受支持。这意味着当编译器遇到接受/忽略的关键字或扩展时,编译不会停止,但在应用程序中不会实现其 GNU 语义。 在严格的语言级别(stdc89stdc99)下编译使用这些扩展的源代码将导致错误消息。

相关参考

在 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 支持
仅用于 C++init_priority
支持
mode 支持
model 接受/忽略
nocommon 支持
packed 支持
section 支持
transparent_union 支持
unused 接受/忽略
weak 支持

相关参考

类型属性

当定义 structunion 类型时,使用关键字 __attribute__ 来指定这些类型的特殊属性。此关键字后跟用两个括号括住的属性说明。XL C/C++ 支持 GNU C 和 C++ 类型属性的一部分。描述为接受/忽略的行为意味着接受其语法,但是忽略其语义,编译继续进行。

GNU C/C++ 类型属性与 XL C/C++ 的兼容性
类型属性 行为
aligned 支持
packed 支持
transparent_union 支持
unused 接受/忽略

相关参考

GNU C 和 C++ 断言

使用断言来测试已编译程序将在哪一种计算机或系统上运行。预定义了断言 #cpu#machine#system。也可以使用预处理伪指令 #assert#unassert 来定义断言。

XL C/C++ 中的 GNU C 和 C++ 断言
GNU C 断言 行为
#assert 支持
#unassert 支持
#cpu 支持可能的值为 powerpc
#machine 支持可能的值为 powerpcbigendian
#system 支持可能的值为
unixposix

其它 GNU C 和 C++ 可移植性问题

与 GNU C 和 C++ 相关的下列功能在扩展的语言级别(extc89extc99extended)下受支持。

在扩展语言级别(extc89extc99extended)下,XL C/C++ 识别以下功能的语法,但不支持它们的语义。

相关参考

标准 C++ 数字处理库头文件

应该指出的是,不是所有 XL C++ 头文件 <cmath><cstdlib> 中的数学函数都能处理整数类型的自变量。因为在将自变量从整数类型转换为浮点类型时,可能会创建等级相同的多个重载解析。

例如,在 C++ 程序中对一个 unsigned int 或者一个 unsigned long 取绝对值时会导致重载解析错误,即使 XL C++ 实现其头文件中的 abs() 库函数所要求的所有特征符。

int abs(int);
long abs(long);
float abs(float);
double abs(double);
long double abs(long double);

甚至在包括 XL 头文件 <math.h><stdlib.h> 两者后,此问题仍然存在。变通方法是,在函数中使用无符号整数类型的自变量之前先将它强制转换为合适的类型。 IBM Copyright 2003