簡體   English   中英

scanf_s 不包含在 C11 中

[英]scanf_s is not included in C11

我正在使用 Dev-C++ 5.11 並使用編譯器選項編譯到 C11。 我在使用scanf_s function 時遇到問題。 我試過<stdio.h><stdlib.h>

標准庫中是否有包含此內容的內容?

scanf_s和其他附件 K 函數實際上是 Microsoft 專用的。

正如其他人所指出的,它們是可選功能,但實現它們的唯一廣泛使用的開發環境是來自 Microsoft 的開發環境,而且 Microsoft 的實現不符合標准且不可移植。

根據N1967 - 附件 K 的現場經驗 - 邊界檢查接口]( http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1967.htm ):

...

可用的實現

盡管 API 規范已經存在了十多年,但只有少數實現具有不同程度的完整性和一致性。 以下是對已知存在的實現及其狀態的調查。

雖然下面的兩個實現以可移植源代碼形式作為開源項目提供,但沒有一個流行的開源發行版,如 BSD 或 Linux 選擇向其用戶提供任何一個。 至少有一個(GNU C 庫)一再拒絕納入提案,原因與奧斯汀集團在其對 TR 24731-1 N1106 的初步審查中指出的原因相同。 這些發行版的未來版本似乎不太可能提供 API。

微軟視覺工作室

Microsoft Visual Studio 實現了 API 的早期版本。 但是,實現不完整,既不符合 C11 也不符合原始 TR 24731-1。 例如,它不提供 set_constraint_handler_s function,而是定義了一個 _invalid_parameter_handler _set_invalid_parameter_handler(_invalid_parameter_handler) function,但簽名略有不同。 它也沒有定義 abort_handler_s 和 ignore_handler_s 函數、memset_s function(它不是 TR 的一部分)或 RSIZE_MAX 宏。Microsoft 實現也不將重疊的源和目標序列視為運行時約束違規和相反,在這種情況下具有未定義的行為。

由於與規范存在大量偏差,因此不能將 Microsoft 實施視為符合標准或可移植的。

注意結論:由於與規范有許多偏差,微軟的實現不能被認為是符合或可移植的。

因此,如果您在 Microsoft 編譯器上使用這些函數,您最終會編寫不可移植的代碼。

我在使用 scanf_s function 時遇到問題。 我試過 <stdio.h> 和 <stdlib.h>。 標准庫中是否有包含此內容的內容?

自 C11 以來, scanf_s()是 C 的一部分。 它在“附件 K,邊界檢查接口”中,它是可選的。 測試__STDC_LIB_EXT1__的可用性。

定義__STDC_LIB_EXT1__的實現應符合本附件中的規范。 C17dr § K.2 2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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