0

为什么 C 编译器供应商通常不向最终用户提供关于“其他形式的常量表达式”(C11,6.6.10)的实现定义行为的附加一致性文档(似乎是这样)?

C11,6.6.10:

一个实现可以接受其他形式的常量表达式。

这一事实导致以下反应/反馈(取自不同来源):

SO用户MM:

编译器供应商应该发布一致性文档,列出它接受哪些表达式作为常量,尽管我找不到 MSVC 的文档。(如果可以,请发表评论!)

来源:https ://stackoverflow.com/a/62161678/9881330

SO用户基思汤普森:

诚然,该标准似乎不需要这样的文档(我觉得这有点令人惊讶)。

来源:https ://gcc.gnu.org/bugzilla/show_bug.cgi?id= 66618(2015-07-01 00:48:48 UTC)

由于6.6.10与实现定义的行为有关,并且由于“每个实现都应包括描述其特征和行为的文档”(C++ 标准,第 1.9 节),为什么在6.6.10? 如果这里有人代表任何(工业)C 编译器供应商,请提供原因/评论情况。

PS 问题的根源是与«其他形式的常量表达式»相关的可能的可移植性问题。如果最终用户在编写代码之前(而不是之后,对可移植性问题感到惊讶)确切地知道哪些“其他形式的常量表达式”被“实现接受”,将会节省很多时间。

UPD。关于«在使用实现定义的行为时,我会假设存在可移植性问题,除非另有证明»。如果一个软件产品计划在 N 个编译器之间移植,并且所有 N 个编译器都支持相同的 IB 相关语言特性,这在编写代码时很有用,但考虑到实现定义的行为,那为什么不使用它呢?唯一的问题是我们需要提前知道所有N个编译器都支持这个IB相关的语言特性。(是的,我们可以凭经验/实验找到它,但如果有许多与 IB 相关的语言功能,这可能会很耗时。最好有编译器供应商的官方声明,支持此 IB 相关的语言功能/ 不支持。)

4

0 回答 0