繁体   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