【问题标题】:Cross Platform usage of printf_s and scanf_s functions - C (linux/win32) [duplicate]printf_s 和 scanf_s 函数的跨平台使用 - C(linux/win32)[重复]
【发布时间】:2018-02-13 12:09:06
【问题描述】:

我目前正在尝试获取一些我最初为 linux (gcc) 编写的 C 代码,以便在 win32 机器上构建。

MSVC 编译器针对我的所有 printfscanf 用法向我发出警告,建议我应该使用 printf_sscanf_s 作为更安全的替代方案。

忽略 100 条编译器警告从来都不是一件好事,但在这种情况下我应该这样做吗?

有没有简单的解决方法来解决这个问题?也许将这些函数封装在特定于平台的预处理器指令中?

【问题讨论】:

  • 如果您安全地使用printfscanf,即不让其中任何一个写入提供的缓冲区,您可以忽略这些警告。无论如何,使用特定于平台的预处理器指令,您将为 Windows 使用安全函数,但为 linux 使用相同的旧不安全函数。所以,最好在没有任何错误的情况下使用它们。
  • 似乎没有可用于 gcc 的等效函数。我确实快速浏览了 printf_s,args 似乎与 printf 没有任何区别 - 确实提出了一个问题,为什么您不只是为现有功能应用这些安全增强功能?
  • @bgh fprintf_s() 不允许 "%n"fprintf() 允许 "%n"
  • " ... 作为更安全的选择。" _s 函数并不完全更安全。它们提供了一些好处,但也带来了其他风险。 跨平台代码的一大缺点是选择代码维护加倍,一条路径中的功能/错误差异不会显示在另一条路径中。

标签: c visual-studio gcc stdio


【解决方案1】:

您可以通过在 #include 语句之前定义 _CRT_SECURE_NO_DEPRECATE 来抑制这些警告。但您应该考虑使用新的安全功能。

【讨论】:

  • 问题是如何实现呢?也许每个受平台特定影响的 stdio 函数都有一个包装函数,如果 def 在那里? MSVS 上的 C 是一个正确的旧痛,就像他们正在积极尝试尽可能不合规?
猜你喜欢
  • 2010-10-16
  • 2010-09-23
  • 2012-04-16
  • 2011-01-21
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
  • 1970-01-01
  • 2016-03-29
相关资源
最近更新 更多