簡體   English   中英

Microsoft C/C++:“嚴格一致性”wrt 實現的定義是什么?

[英]Microsoft C/C++: what is the definition of "strict conformance" w.r.t. implementation?

語境:

/Za, /Ze(禁用語言擴展)

... C 編譯器嚴格遵守 C89/C90 標准

/permissive-(符合標准)

...並設置 /Zc 編譯器選項以實現嚴格的一致性

Visual Studio 2019 中的 C++ 一致性改進、行為更改和錯誤修復

... /permissive 可以指定關閉編譯器中的嚴格一致性模式。

第二個選項是為了禁用嚴格的一致性模式......

時鍾

請注意,這並不嚴格符合 ISO C99 ...

演練:在命令行上編譯 C 程序

MSVC 與 ANSI C89 和 ISO C99 標准兼容,但不嚴格遵守。

問題:“嚴格一致性”的定義是什么? 是微軟發明的嗎?

注意:C (n2596.pdf) 和 C++ (n4849.pdf) 標准都沒有使用術語“嚴格符合”/“嚴格符合”應用於實現。 實現要么符合,要么不符合。 無漸變。

更新。 我的猜測:在“嚴格一致性”(與實現相關)下,微軟的意思是“不支持任何擴展的一致性實現”。

您感到困惑的一個關鍵部分是/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/annoucing-full-support-for-acc-conformant-preprocessor-in-msvc/

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM