3.3 选择源语言标准
KF32编译器对不同的源语言标准提供不同程度的支持。编译器会根据文件扩展名推断源语言(例如C或C++)。
3.3.1 源语言标准
KF32工具链交付的 C 标准库声明支持 C90 与 C99,C++ 标准库声明支持 C++14,对应的编译选项如下表所示。
表3.3 KF32编译器支持标准
| Standard C | GNU C | Standard C++ | GNU C++ |
|---|---|---|---|
| C90 | GNU90 | C++14 | GNU++14 |
| C99 | GNU99 | ||
| C11 | GNU11 |
当前编译器的稳定基线为 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编译器行为保持一致。