C++ open()函数的_sopen_s()等价物是什么?

C++ open()函数的_sopen_s()等价物是什么?,c++,c,windows,C++,C,Windows,微软已经弃用了OpenS,取而代之的是sopen。 推荐的等效论点是什么?最好的建议是忽略所有微软出于政治动机的抨击。与正确使用现有的标准C或POSIX类函数相比,它们的“安全”函数没有实际的安全优势,如果使用不当,它们与它们要替换的函数一样“不安全”。现在,我可以发布格式良好的答案,如下所示: 为了 取代 int fd; errno_t errno = _sopen_s(&fd,name,oflags,_SH_DENYNO,0); 我发布这个问答的原因是,它提供了微软没有提供的重要的

微软已经弃用了OpenS,取而代之的是sopen。
推荐的等效论点是什么?

最好的建议是忽略所有微软出于政治动机的抨击。与正确使用现有的标准C或POSIX类函数相比,它们的“安全”函数没有实际的安全优势,如果使用不当,它们与它们要替换的函数一样“不安全”。

现在,我可以发布格式良好的答案,如下所示:

为了

取代

int fd;
errno_t errno = _sopen_s(&fd,name,oflags,_SH_DENYNO,0);

我发布这个问答的原因是,它提供了微软没有提供的重要的非显而易见的信息。我同意sopen是open的糟糕替代品。我之所以研究这个主题,是因为我正在修复一个由提供给sopen的错误参数引起的错误。在代码中,sopen只是为了消除编译器警告;最初的_open调用很好。

我建议在Windows上使用,除非有充分的理由不这样做。在Linux上,“打开”映射到内核函数,在Windows上映射到库函数,无论如何都使用“CreateFile”。
根据可移植性,此函数在Microsoft平台(Win32/64/CE)上的可移植性更强。当然,在*nix上不可用。

以下是答案(我不允许回答我自己的问题)。对于
intfd=\u open(标签名称)替换为
intfd;errno\u t errno=\u sopen\u s(&fd,名称,标签编号,0)当然你可以回答你自己的问题。。。只是在你发布了你的问题之后没有马上。试着再把它作为一个答案。啊,论点的膨胀。Win32是的。我不允许在提问后8小时内回答问题。我在8小时的监狱里(这是一个非常具有挑衅性的说法。你有证据支持它吗?之前已经讨论过了,但它实际上并不需要证据,只需要一些基本的推理能力……也许你指的是“出于政治动机”这个短语。)。这确实需要证据,而我的回答的其余部分只是“安全”函数没有“更安全”的地方。当然,如果你制作一个毫无理由不兼容的接口来做一些现有接口做得很好的事情,并且错误地将现有的标准接口描述为“不安全”甚至添加恼人的编译器警告,试图阻止人们使用标准接口,很明显你有破坏标准的动机。@R:只要正确使用标准函数,然后定义
\u SCL\u SECURE\u NO\u warnings
\u STL\u SECURE\u NO\u warnings
。我认为OP并不是在寻找一个解决方案您还需要他更改所有读/写/任何调用。因此您最好尝试将0作为第四个参数传递?他们至少可以这样做,即传递0意味着您不关心该标志或选项。当前将0作为该参数传递会引发异常并终止您的应用程序。如果我发现_wopen的MS代码,我将e如下:errno\u t const\u Result=\u wsopen\u dispatch(\u FileName,\u OFlag,\u shu DENYNO,\u PMode,&\u FileHandle,0);因此它使用shu DENYNO而不是shu DENYRW。你是对的,它是\u shu DENYNO。我已经更新了答案。
int fd;
errno_t errno = _sopen_s(&fd,name,oflags,_SH_DENYNO,0);