C17代码可以被解释为C23代码吗?如果不能,有什么突破性的变化?
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)。
isr3a4wc2#
据我所知,C23还没有被正式批准,但是根据提议的修改,是的,它与C17是向后兼容的。只有当你依赖于像C89这样的非常旧的标准时,你才必须删除一些功能。(三重图,旧风格的函数定义等)但是这些功能与现代C无关。在最新的proposal中寻找过时的功能。更新:是的,如果你正在寻找上面的一些吹毛求疵的答案,那么当然你可以在C17中编写无法在C23中编译的代码,比如使用奇怪的关键字,或者如果你为true和false定义了自己的宏。但是如果你正在寻找一个常识性的答案,那么C17代码将在C23中编译(实际上)在所有情况下。没有人使用像constexpr这样的变量名。
true
false
constexpr
2条答案
按热度按时间kyks70gy1#
不,C23不是完全向后兼容的。不是所有的C17程序都可以编译成C23程序。
在其他重大变化中,C23引入了新的关键字和声明说明符。使用这些标识符的C17程序不能被解释为C23程序。
例如,以下所有内容在C17程序中有效,但在C23程序中无效。
字符串
更危险的是,下面的代码在C17和C23中有不同的含义(尽管它不太可能出现在C17程序中):
型
有关C23中主要更改的更完整说明,请参见Annex M.2 of N3096(C23的最新工作草案,2023-04-01)。
isr3a4wc2#
据我所知,C23还没有被正式批准,但是根据提议的修改,是的,它与C17是向后兼容的。只有当你依赖于像C89这样的非常旧的标准时,你才必须删除一些功能。(三重图,旧风格的函数定义等)但是这些功能与现代C无关。在最新的proposal中寻找过时的功能。
更新:是的,如果你正在寻找上面的一些吹毛求疵的答案,那么当然你可以在C17中编写无法在C23中编译的代码,比如使用奇怪的关键字,或者如果你为
true
和false
定义了自己的宏。但是如果你正在寻找一个常识性的答案,那么C17代码将在C23中编译(实际上)在所有情况下。没有人使用像constexpr
这样的变量名。