【发布时间】:2015-02-11 12:16:25
【问题描述】:
我正在调试模式下使用 MSVC (VS 2013) 编译一个跨平台的 C 库(在 Linux 上运行良好,并且曾经在 Windows 上运行)。当我从 C 标准库调用 read 时,有时会出现异常:
一个无效参数被传递给一个认为无效参数致命的函数。
我相信参数(文件描述符、缓冲区、长度)是可以的。即使文件描述符无效,我也希望它返回-1。代码(不是我自己的,它是跨平台的,在 Linux 上运行良好)实际上会检查返回值是否为 -1 并采取相应措施。
MSDN 非常无用,只是说:
不推荐使用此 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()。