#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;
}
上述代码在使用 -std=C23 编译为 C 时,可以使用 GCC 顺利编译,但使用 -std=c++23 编译为 C++ 时则无法顺利编译。请参阅https://godbolt.org/z/Tsf7MahPe
错误是
<source>:13:23: error: '_Bool' was not declared in this scope
13 | bool overflowed = ckd_add(&result, value1, value2);
具有讽刺意味的是,你必须在 C++ 中包含 <stdbool.h>,但在 C 中却不需要:D。
-> 在 C++ 中使用 C std 库时,是否可以指定 C23 模式(或任何其他模式,特别是 GCC)?
(我假设出现此错误是因为 C lib 不在 C23 模式,因此没有 bool 和 _Bool)
编辑:我的假设是错误的。C 版本已经是 C23,否则ckd_add
应该不可用。不过,原始问题尚未得到解答。
C++ 的每个版本都引用 C 的特定版本作为规范参考。
例如,C++23 引用 C17。因此,后来添加到 C 中的任何内容都不会成为 C++23 的一部分(除非恰巧出现趋同演化,即标准恰巧彼此独立地指定相同的功能)。
即使 C++23 引用了 C17,也并不意味着 C++23 支持所有 C17 功能。相反,C++ 标准明确提到了哪些功能已纳入 C++,哪些功能未纳入。
您不能指望在 C++ 代码中使用未纳入 C++ 的 C 标准库函数。混合搭配 C 和 C++ 版本也没有任何意义。
因此,您不能保证它
<stdckdint.h>
或其中声明的函数在任何版本或任何编译器配置下都能在 C++ 中工作。如果它以某种方式得到支持,那么这就是编译器即将推出的,并且纯粹是编译器特定的扩展。当然,您可以很好地向编译器编写者请愿,如果他们能以某种方式编写 C 库函数,使它们也可以在 C++ 代码中使用。这取决于他们。重要的是要明白,这是两种截然不同的语言,只是由于起源而具有某些共同的子集。 也有一些努力来维护或扩展这个共同的子集,但这两种语言在其他方面都是独立发展的。
在 C++ 中,
_Bool
默认情况下不定义 C 中的类型,因为该语言提供了自己的bool
类型作为内置的本机类型。C++ 语言设计有意将自己与 C 的一些遗留功能区分开来。以下是_Bool
C++23 中默认不可用的原因_Bool
作为 C 兼容层的一部分保留在 C++ 语言中。如果您将其包含<stdbool.h>
在 C++ 程序中,它会将 bool 定义为 的别名_Bool
,以及 true 和 false。相反,
_Bool
在 C23 中是内置类型,自 C99 以来一直如此。C 语言明确定义_Bool
为基本类型,用于表示布尔值(true
和false
)。stdbool.h
这就是为什么在编译为 C++ 时必须包含的原因所以如果你想使用这个头文件 - 你必须接受它或者写一些更像 C++ 的东西
stdckdint.h
是 C 标头,在 C23 标准中定义。它不适用于 C++ 程序。在本例中,它失败了,因为它尝试使用_Bool
,而(正如其他答案和评论指出的那样)它在 C++ 中不存在。可以识别 C++ 标准库中的头文件,因为它们没有文件扩展名,例如
cstdint
而不是stdint.h
。不幸的是,目前还没有 C++ 等效的stdckdint.h
(目前还没有?)。其他人已经回答了你的问题,我只想说你可以使用预定义的宏来有条件地包含,
<stdbool.h>
如下所示:该
__STDC_VERSION__
宏将扩展为类似的值,指定所使用的 C 标准。 官方文档。