跳到主要内容

3.3 选择源语言标准

KF32编译器对不同的源语言标准提供不同程度的支持。编译器会根据文件扩展名推断源语言(例如C或C++)。

3.3.1 源语言标准​

KF32工具链交付的 C 标准库声明支持 C90 与 C99,C++ 标准库声明支持 C++14,对应的编译选项如下表所示。

表3.3 KF32编译器支持标准

Standard CGNU CStandard C++GNU C++
C90GNU90C++14GNU++14
C99GNU99
C11GNU11

当前编译器的稳定基线为 C99,C11 特性目前仍处于实验性测试阶段。为确保代码的稳定性与兼容性,建议优先使用 C99 标准。

建议始终使用 -std=<name> 选项显式指定源语言标准(如 -std=c99、-std=c++14),不要依赖编译器的默认标准。

3.3.2 常用语言标准的支持情况​

KF32 C/C++库对不同的源语言标准提供不同程度的支持。下表列出了常用语言标准的支持例外情况:

表3.4 对语言标准的支持存在例外情况

语言标准对语言标准的支持存在例外情况
C90<math.h> 未实现数学错误处理:定义域错误与值域错误均不设置 errno(math_errhandling == 0)。程序须以返回值(HUGE_VAL / NaN)判断数学错误,不可依赖 errno。
C99<math.h> 未实现数学错误处理(同 C90);
printf 族的 %n 转换不生效(静默不写);
<fenv.h> 的舍入方向宏有定义,但 fesetround 不生效、fegetround 恒返回 FE_TONEAREST;
rename() 在交付库中无实现,使用该函数会链接失败;
宽字符 stdio 集成不完整:窄 printf 的 %ls 按 %s 处理,宽字符流向流输出 wchar_t 的原始字节;
fwide 的返回值与流定向、fgetwc 的 EOF 标志存在偏差。
C++14以下 C++14 标准组件不可用:
异常处理:交付配置为 -fno-exceptions,throw/try/catch 及异常抛出路径不可用;
输入输出:<iostream> 等头文件间接包含即编译失败,[input.output] 整章不可用;
线程库:<thread>、<mutex>、<condition_variable>、<future>、<shared_mutex> 不可用;
本地化:[locale]、<codecvt>、<regex> 不可用;
宽字符:<cwchar>、<cwctype>、<wchar.h> 不可用;
<atomic> 相关接口:可编译,但运行期链接失败;
<system_error>:链接期失败;
<cuchar>:头文件缺失。
所有支持的标准版本对于所有支持的标准,libc++ 库与标准库存在以下差异:
对于 std::vector<bool>::const_reference,标准要求 const_reference 类型为 bool。然而,在 libc++ 中,const_reference 类型是一个实现定义的只读位引用类。

3.3.3 未定义行为​

C和C++标准将那些使用不可移植、错误的程序或数据结构的代码视为未定义行为。对于存在未定义行为的程序,ChipON不对KF32工具链的行为提供任何信息或保证,若KF32工具链未做特殊说明,则表示与通用LLVM编译器行为保持一致。