【问题标题】:"deprecated POSIX function" `read` raises an exception“不推荐使用的 POSIX 函数”`read` 引发异常
【发布时间】:2015-02-11 12:16:25
【问题描述】:

我正在调试模式下使用 MSVC (VS 2013) 编译一个跨平台的 C 库(在 Linux 上运行良好,并且曾经在 Windows 上运行)。当我从 C 标准库调用 read 时,有时会出现异常:

一个无效参数被传递给一个认为无效参数致命的函数。

我相信参数(文件描述符、缓冲区、长度)是可以的。即使文件描述符无效,我也希望它返回-1。代码(不是我自己的,它是跨平台的,在 Linux 上运行良好)实际上会检查返回值是否为 -1 并采取相应措施。

MSDN 非常无用,只是说:

read

不推荐使用此 POSIX 函数。请改用符合 ISO C++ 标准的 _read

但是,我刚刚尝试将read 替换为_read,并且效果很好。

  • read_read 之间到底有什么区别?由于read 没有记录在案,我不能只查找它。它似乎做同样的事情,但也会引发异常。

  • 我可以混合使用“已弃用的 POSIX 函数”和“符合 ISO C++ 的”* 函数吗?例如“open”和“_read”?它似乎工作正常

  • 我可以只使用#define read _read 等等,并期望它像在 Linux 上一样工作吗?


*) 请注意,尽管文档中使用了语言,但该项目是纯 C 而非 C++。 MSVC 的奇怪之处在于它不是真正的 C 或 C++,而是某种意义上的 C/C++。此外,引发异常的事实并不意味着我使用的是 C++,而是 C、IIRC 的非标准 Windows 扩展。

【问题讨论】:

  • 没有 plain c 这样的东西,它只是 c。不要写c/c++ 你可以写c and/or c++ 或类似的东西,这两种语言之间有非常重要的区别,它不像c++ 只是c 带有类和模板。
  • 你相信吗?你检查参数了吗? read()_read() 没有区别。
  • 您可以通过将_CRT_NONSTDC_NO_DEPRECATE=1 添加到预处理器定义中来使警告消失(请参阅msdn.microsoft.com/en-us/library/ms235384.aspx)。 read_read 的行为应该完全相同,所以如果用另一个替换一个对你有用,你可能正在追逐一些(可能)不相关的 UB。
  • @iharob:我知道这一点(尤其是 C 不仅仅是 C++ 的一个子集)。我在这里使用 C,而不是 C++。但是 C 标准函数 read 在 MSVC 下对我来说表现得很奇怪,MSDN 告诉我使用它所谓的“ISO C++ 函数”_read在我的 C 程序中。关键是微软的编译器和文档混淆了 C 和 C++。这不是我的困惑,而是 MSVC 的困惑。
  • 对于#define:使用静态包装函数可能会更好(如果在Windows 上使用非POSIX _read 会更好)。 read(一个相当常见的词)很容易成为某个成员函数或在其他命名空间中声明,宏也会扩展,例如对于foo.read()foo::read()

标签: c posix msvc12


【解决方案1】:

我可以只使用#define read _read 等等,并期望它像在 Linux 上一样工作吗?

是的,只要这样做,它就会解决问题,而且你的代码将是跨平台的,只要记住还有其他功能有同样的问题。

【讨论】:

    猜你喜欢
    • 2019-05-13
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多