You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C++模式下使用C标准头文件时,如何指定C版本(以GCC为例)

在C++模式下使用C标准头文件时,如何指定C版本(以GCC为例)

首先看这段示例代码:

#include <stdio.h>
#include <stdckdint.h>
#include <stdint.h>
//#include <stdbool.h> // needed when compiled as c++ with -std=c++23

int main()
{
    int64_t value1 = 34;
    int32_t value2 = 177;
    uint8_t result;
    bool overflowed = ckd_add(&result, value1, value2);
    if (overflowed) {
        printf("result overflowed\n");
    } else {
        printf("result is %hhu\n", result);
    }
    return 0;
}

这段代码用GCC以-std=C23编译为C时完全正常,但用-std=c++23编译为C++时会报错:

<source>:13:23: error: '_Bool' was not declared in this scope
   13 |     bool overflowed = ckd_add(&result, value1, value2);

挺讽刺的——在C里不用包含<stdbool.h>,反而在C++里需要,对吧?

你的核心问题是:在C++中使用C标准库时,能不能指定C版本(比如GCC的C23模式)?

首先先澄清你的初始假设:这个错误并不是因为C标准库没在C23模式下——毕竟如果是这样的话,ckd_add这个C23的函数根本就不会可用。问题的根源在于C++和C对标准库的兼容规则本身。

为什么会出现这个错误?

在C23中,bool已经成为关键字,<stdckdint.h>里的ckd_add返回_Bool类型,而C23模式下编译C代码时,编译器会自动处理_Bool和bool的映射,不需要额外包含<stdbool.h>。但在C++中,情况不同:

  • C的bool是原生关键字,但C标准库的头文件在被C包含时,会遵循C++标准的兼容规则,而非单独的C标准。
  • 目前C23标准兼容的是C17的标准库,并没有完全对齐C23的所有特性。对于ckd_add这类C23新增的函数,GCC在C模式下包含<stdckdint.h>时,函数声明返回的是C的_Bool类型,但C中并没有内置_Bool这个类型——必须包含<stdbool.h>,它会把_Booltypedef为C的bool,才能让编译器识别。

回到你的问题:能在C++中指定C标准库用C23模式吗?

很遗憾,GCC目前没有这样的选项。原因是C标准本身就定义了它如何集成C标准库:C的每个版本会绑定到特定版本的C标准库(比如C23绑定C17),而不是允许用户单独指定C标准库的版本。C不会直接采用C标准的最新特性,而是会经过筛选、调整后逐步纳入后续的C++标准中。

解决这个问题的临时方案

既然不能单独指定C标准库的版本,我们可以通过代码的兼容性处理来绕过这个错误:

  • 用条件编译在C++中自动包含<stdbool.h>:
    #ifdef __cplusplus
    #include <stdbool.h>
    #endif
    
    这样既不影响C模式的编译,又能解决C++模式下的_Bool未声明错误。
  • 或者手动在C++编译时显式包含<stdbool.h>,就像你注释掉的那行代码一样。

备注:内容来源于stack exchange,提问作者user765269

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 10:09:52