C23标准是否向后兼容?

rqqzpn5f  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(132)

C17代码可以被解释为C23代码吗?如果不能,有什么突破性的变化?

kyks70gy

kyks70gy1#

不,C23不是完全向后兼容的。不是所有的C17程序都可以编译成C23程序。
在其他重大变化中,C23引入了新的关键字和声明说明符。使用这些标识符的C17程序不能被解释为C23程序。
例如,以下所有内容在C17程序中有效,但在C23程序中无效。

int* nullptr = 0;
int true = 1;
int bool = 0;
int constexpr = 1;
void static_assert() { /* ... */ }

字符串
更危险的是,下面的代码在C17和C23中有不同的含义(尽管它不太可能出现在C17程序中):

auto d = 1.5;


有关C23中主要更改的更完整说明,请参见Annex M.2 of N3096(C23的最新工作草案,2023-04-01)。

isr3a4wc

isr3a4wc2#

据我所知,C23还没有被正式批准,但是根据提议的修改,是的,它与C17是向后兼容的。只有当你依赖于像C89这样的非常旧的标准时,你才必须删除一些功能。(三重图,旧风格的函数定义等)但是这些功能与现代C无关。在最新的proposal中寻找过时的功能。
更新:是的,如果你正在寻找上面的一些吹毛求疵的答案,那么当然你可以在C17中编写无法在C23中编译的代码,比如使用奇怪的关键字,或者如果你为truefalse定义了自己的宏。但是如果你正在寻找一个常识性的答案,那么C17代码将在C23中编译(实际上)在所有情况下。没有人使用像constexpr这样的变量名。

  • Minirant*:Stackoverflow是一个低质量的空间,因为它坚持对无关的边缘案例进行挑剔。这里的用户想要学习,而不是阅读法律的文档。至少,这就是我在这里的原因。精确有它的位置,但如果它掩盖了重要的事实,就不是了。

相关问题