避免依赖由实现定义的行为
1.17 ID_implementationDefinedFunction
语言标准允许程序的某些行为可由编译器自行定义,这种行为称为由实现定义的行为(implementation-defined behavior),虽然有文档支持,但也会增加移植或兼容等方面的成本。
示例:
- cstdlib、stdlib.h 中的 abort、exit、_Exit、quick_exit、getenv、system 等函数
- ctime、time.h 中的 clock 等函数
- csignal、signal.h 中的 signal 等函数
这些函数的行为取决于编译器、库或环境的生产厂家,同一个函数不同的厂家会有不同的实现,故称这种函数的行为是“由实现定义”的。有高可靠性要求的软件系统应避免使用这种函数,否则需明确各种实现上的具体差异,增加了移植、发布以及兼容性等多方面的成本。
#include <cstdlib>
void foo() {
abort(); // Non-compliant
}
调用 abort 函数会终止进程,但打开的流是否会被关闭,缓冲区内的数据是否会写入文件,临时文件是否会被清理则由实现定义。
相关
依据
ISO/IEC 9899:2011 7.14.1.1(3)-implementation
ISO/IEC 9899:2011 7.22.4.1(2)-implementation
ISO/IEC 9899:2011 7.22.4.4(5)-implementation
ISO/IEC 9899:2011 7.22.4.5(2)-implementation
ISO/IEC 9899:2011 7.22.4.6(2)-implementation
ISO/IEC 9899:2011 7.22.4.7(4)-implementation
ISO/IEC 9899:2011 7.22.4.8(3)-implementation
ISO/IEC 9899:2011 7.27.2.1(3)-implementation