上下文:
..。C编译器严格遵守C89/C90标准
..。并设置严格一致性的/Zc编译器选项。
VisualStudio2019中的C++一致性改进、行为更改和bug修复
可以指定/permissive来关闭编译器中的严格一致性模式。 第二个选项是禁用严格的一致性模式..。
请注意,这并不严格符合C99 .
MSVC与ANSI C89和ISO C99标准兼容,但没有严格遵守。
问:“严格一致”的定义是什么?它是微软发明的吗?
注:C (n2596.pdf)和C++ (n4849.pdf)标准均不使用术语“严格一致”/“严格一致”用于实现。实现要么符合,要么不符合。W/o级。
UPD。我猜:在“严格遵守”(w.r.t。Microsoft的意思是“对任何扩展提供一致的实现w/o支持”。
发布于 2021-10-14 18:30:24
C11标准在第4节第5至7段中定义了严格一致的方案和实施如下:
5严格符合标准的程序只应使用本国际标准中规定的语言和库的特征。它不应产生依赖于任何未指定的、未定义的或实现定义的行为的输出,并且不应超过任何最低实现限制。 6协调实施的两种形式是托管和独立的。合格的托管实现应接受任何严格符合的程序。符合规范的独立实现应接受任何严格符合的程序,其中对库子句(第7条)中指定的特性的使用仅限于标准标头、、、、、、、和的内容。符合规范的实现可能有扩展(包括附加的库函数),只要它们不改变任何严格符合的程序的行为。 一个符合的程序是一个符合的实现可以接受的程序。
虽然此处没有出现严格符合实现和严格一致性的术语,但它们可以理解为指只接受严格一致的程序(或者更准确地说,不支持标准中未指定的特性的实现)的实现(在给定模式下)。
发布于 2021-10-14 20:44:34
您混淆的一个关键部分是,/Za和/Ze已经过时了,已经很久没有更新了。它是为ANSI 98推出的,从那以后就没有改变过。不要使用这些开关,而忽略文档中对它们的任何引用。
现代的VisualC++“一致性”开关是/permissive-和各种/Zc开关,与/std相结合。
目前的“最符合”选项是:
/std:c++20/std:c++17 /permissive- /Zc:preprocessor。/std:c++14 /permissive- /Zc:preprocessor。/std:c11/std:c17https://devblogs.microsoft.com/cppblog/msvc-cpp20-and-the-std-cpp20-switch/
VisualC++的部分一致性问题与预处理程序有关。
https://devblogs.microsoft.com/cppblog/c11-and-c17-standard-support-arriving-in-msvc/
有关按功能细分的特性,请参见Microsoft。
https://stackoverflow.com/questions/69575307
复制相似问题