Microsoft C/C++:w.r.t. 的“严格一致性”的定义是啥?执行?
Posted
技术标签:
【中文标题】Microsoft C/C++:w.r.t. 的“严格一致性”的定义是啥?执行?【英文标题】:Microsoft C/C++: what is the definition of "strict conformance" w.r.t. implementation?Microsoft C/C++:w.r.t. 的“严格一致性”的定义是什么?执行? 【发布时间】:2021-12-03 02:27:54 【问题描述】:上下文:
/Za, /Ze (Disable Language Extensions):
...C 编译器严格遵守 C89/C90 标准
/permissive- (Standards conformance):
... 并设置 /Zc 编译器选项以实现严格一致性
C++ Conformance improvements, behavior changes, and bug fixes in Visual Studio 2019:
... /permissive 可以指定关闭编译器中的严格一致性模式。
第二个选项是为了禁用严格的一致性模式...
clock:
请注意,这并不严格符合 ISO C99 ...
Walkthrough: Compile a C program on the command line:
MSVC 与 ANSI C89 和 ISO C99 标准兼容,但并不严格遵守。
问题:“严格符合”的定义是什么?是微软发明的吗?
注意:C (n2596.pdf) 和 C++ (n4849.pdf) 标准都没有使用术语“严格符合”/“严格符合”应用于实现。实现要么符合,要么不符合。无渐变。
UPD。我的猜测:在“严格一致性”(w.r.t. to implementation)下,微软的意思是“不支持任何扩展的一致性实现”。
【问题讨论】:
一致性可以有不同的程度。严格符合,或严格符合意味着无任何例外地符合。你不会在标准中找到这个,这就是英语的工作原理。 permissive- 突出的另一个问题是模板中的依赖名称。没有许可——MSVC 对要求“typename”模板参数限定非常宽松。 @NathanOliver C 标准(例如)定义了以下术语:“严格符合程序”、“符合程序”、“符合执行”。它没有定义“严格符合的实现”。因此,最终用户在“严格符合模式”、“严格符合 ISO C99”等下应该理解什么?也许微软的意思是“严格的一致性”(应用于实现)==“不支持任何扩展的一致性实现”? 我认为这在 MSFT 方面可能被认为是模棱两可的语言。 C 标准确实将“严格符合”定义为与程序有关。 MSFT 可能打算使用“严格符合模式”来表示编译器要求程序严格符合,而不是编译器严格符合标准(这不是一回事)。 【参考方案1】:C11 standard 在第 4 节第 5-7 段中定义了一个严格遵守的程序和实现,如下所示:
5严格符合程序应仅使用本文中指定的语言和库的那些特性 国际标准。它不应产生依赖于输出的 在任何未指定、未定义或实现定义的 行为,并且不得超过任何最低实施限制。
6一致的实现的两种形式是托管的和独立的。 符合要求的托管实现应接受任何 严格符合程序。 符合标准的独立式 实施应接受任何严格遵守的程序 其中 * 使用 library 子句中指定的功能 (第 7 条)仅限于标准标题的内容
、 、、 、 、 、 、 和 。一种 符合标准的实现可能有扩展(包括 附加库函数),只要它们不改变 任何严格符合程序的行为。 7符合标准的程序是符合标准的实现可接受的程序。
虽然这里没有出现严格符合实现和严格符合这两个术语,但它们可以理解为表示仅接受严格符合程序(或者更准确地说,不支持标准中未指定的功能的实现)。
【讨论】:
接受所有严格遵守的程序,似乎没有什么能与解决停机问题相提并论。我想他们只是在淘汰那些不适合的人方面做了很好的尝试。 @Deduplicator 不是真的,这只是没有(或禁用)任何语言扩展的问题。 Re“一种只接受严格符合程序的实现(在给定模式下)”:重复数据删除器是正确的,这是不可能的。确定程序是否产生实现定义的行为等同于停止问题。例如,一个程序可能会溢出int
,当且仅当它确定程序是否严格符合的代码报告它在给定程序本身时是严格符合的。
也许你可以定义一个严格遵守的实现,它只接受严格遵守的语法和语法,忽略运行时行为,尽管如果出现问题我也不会感到惊讶。
@dbush 对have a look很有用。【参考方案2】:
您感到困惑的一个关键部分是 /Za
和 /Ze
已被弃用并且很久没有更新了。它是为 ANSI 98 引入的,此后一直没有改变。不要使用这些开关,并忽略文档中对它们的任何引用。
现代 Visual C++“一致性”开关是 /permissive-
和各种 /Zc
开关,与 /std
结合使用。
当前“最符合”的选项是:
C++20 是:/std:c++20
C++17 是:/std:c++17 /permissive- /Zc:preprocessor
。
C++14 是:/std:c++14 /permissive- /Zc:preprocessor
。
C11 是:/std:c11
C17 是:/std:c17
https://devblogs.microsoft.com/cppblog/msvc-cpp20-and-the-std-cpp20-switch/
Visual C++ 的部分一致性问题与预处理器有关
https://devblogs.microsoft.com/cppblog/announcing-full-support-for-a-c-c-conformant-preprocessor-in-msvc/
https://devblogs.microsoft.com/cppblog/c11-and-c17-standard-support-arriving-in-msvc/
有关逐个功能的细分,请参阅Microsoft Docs
【讨论】:
以上是关于Microsoft C/C++:w.r.t. 的“严格一致性”的定义是啥?执行?的主要内容,如果未能解决你的问题,请参考以下文章
Python Expert:如何继承内置类并覆盖每个成员函数 w.r.t.基类成员函数?
Gradle 中的transitive = true 究竟做了啥(w.r.t. crashlytics)?
为啥 Microsoft 的 C/C++ 编译器允许使用逗号分隔表达式的 if 语句? [复制]
在 Windows 7 中通过 GnuWin32 使用 Microsoft Visual C/C++ 编译器编译源 (.C) 文件时出错