[英]Microsoft C/C++: what is the definition of "strict conformance" w.r.t. implementation?
語境:
... C 編譯器嚴格遵守 C89/C90 標准
...並設置 /Zc 編譯器選項以實現嚴格的一致性
Visual Studio 2019 中的 C++ 一致性改進、行為更改和錯誤修復:
... /permissive 可以指定關閉編譯器中的嚴格一致性模式。
第二個選項是為了禁用嚴格的一致性模式......
時鍾:
請注意,這並不嚴格符合 ISO C99 ...
MSVC 與 ANSI C89 和 ISO C99 標准兼容,但不嚴格遵守。
問題:“嚴格一致性”的定義是什么? 是微軟發明的嗎?
注意:C (n2596.pdf) 和 C++ (n4849.pdf) 標准都沒有使用術語“嚴格符合”/“嚴格符合”應用於實現。 實現要么符合,要么不符合。 無漸變。
更新。 我的猜測:在“嚴格一致性”(與實現相關)下,微軟的意思是“不支持任何擴展的一致性實現”。
您感到困惑的一個關鍵部分是/Za
和 / Ze
已被棄用並且已經很久沒有更新了。 它是為 ANSI 98 引入的,此后一直沒有改變。 不要使用這些開關,並忽略文檔中對它們的任何引用。
現代 Visual C++“一致性”開關是/permissive-
和各種/Zc
開關,與/std
結合使用。
當前“最符合”的選項是:
/std:c++20
/std:c++17 /permissive- /Zc:preprocessor
。/std:c++14 /permissive- /Zc:preprocessor
。/std:c11
/std:c17
https://devblogs.microsoft.com/cppblog/msvc-cpp20-and-the-std-cpp20-switch/
Visual C++ 一致性問題的一部分與預處理器有關
https://devblogs.microsoft.com/cppblog/c11-and-c17-standard-support-arriving-in-msvc/
有關逐個功能的細分,請參閱Microsoft Docs
C11 標准在第 4 節第 5-7 段中定義了嚴格符合的程序和實現如下:
5嚴格遵守的程序應僅使用本國際標准中規定的語言和庫的那些特性。 它不應產生依賴於任何未指定、未定義或實現定義的行為的輸出,並且不應超過任何最小實現限制。
6一致實施的兩種形式是托管和獨立。 符合要求的托管實施應接受任何嚴格符合要求的程序。 一致的獨立實現應接受任何嚴格一致的程序,其中庫條款(第 7 條)中指定的特性的使用僅限於標准頭文件 <float.h>、<iso646.h>、<limits 的內容.h>、<stdalign.h>、<stdarg.h>、<stdbool.h>、<stddef.h>、<stdint.h> 和 <stdnoreturn.h>。 符合要求的實現可以有擴展(包括附加的庫函數),只要它們不改變任何嚴格符合程序的行為。
7一致的程序是一致的實現可接受的程序。
雖然此處沒有出現嚴格符合和嚴格符合這兩個術語,但它們可以理解為僅接受嚴格符合程序的實現(在給定模式下)(或者更准確地說,不支持不支持特性的實現)標准中規定)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.