open()、_open() 和 fopen() 在 MSVC 编译器方面的区别?

2023-12-23

我发现这三个函数都与打开文件有关。

open https://msdn.microsoft.com/en-us/library/ms235491(v=vs.120).aspx:

此 POSIX 函数已弃用。使用符合 ISO C++ 标准的 _open 反而。

_open https://msdn.microsoft.com/en-us/library/z0kc8e3z(v=vs.120).aspx:

打开一个文件。这些函数已被弃用,因为更安全 版本可用;参见 _sopen_s、_wsopen_s。

fopen https://msdn.microsoft.com/en-us/library/yeby3zcb(v=vs.120).aspx:

打开一个文件。这些功能的更安全版本执行 提供额外的参数验证和返回错误代码; 参见 fopen_s、_wfopen_s。

那么,为什么是他们三个呢?什么时候用哪个?我认为 POSIX 很好,但为什么 MSDN 说 POSIX 版本open已弃用?还有有没有命名约定与前导下划线相关,这样我就可以根据它的第一眼选择正确的函数?

当我正在调查ACPICA代码 https://github.com/acpica/acpica/,我看到下面的代码: 看来_XXX版本可以禁用一些MS 语言扩展,这些扩展到底是什么?

/*
 * Map low I/O functions for MS. This allows us to disable MS language
 * extensions for maximum portability.
 */
#define open            _open
#define read            _read
#define write           _write
#define close           _close
#define stat            _stat
#define fstat           _fstat
#define mkdir           _mkdir
#define snprintf        _snprintf
#if _MSC_VER <= 1200 /* Versions below VC++ 6 */
#define vsnprintf       _vsnprintf
#endif
#define O_RDONLY        _O_RDONLY
#define O_BINARY        _O_BINARY
#define O_CREAT         _O_CREAT
#define O_WRONLY        _O_WRONLY
#define O_TRUNC         _O_TRUNC
#define S_IREAD         _S_IREAD
#define S_IWRITE        _S_IWRITE
#define S_IFDIR         _S_IFDIR

ADD 1

好像是单下划线前缀_XXX是微软的约定。例如_DEBUG https://msdn.microsoft.com/en-us/library/0b98s6w8.aspx, _CrtSetDbgFlag https://msdn.microsoft.com/en-us/library/5at7yxcs.aspx,以及前面提到的_open https://msdn.microsoft.com/en-us/library/z0kc8e3z(v=vs.120).aspx。部分引述自MSDN https://msdn.microsoft.com/en-us/library/2e6a4at9.aspx:

在 Microsoft C++ 中,带有两个前导下划线的标识符是 保留用于编译器实现。因此,微软 约定是在 Microsoft 特定关键字之前加上 double 下划线。这些词不能用作标识符名称。

默认情况下启用 Microsoft 扩展。为确保您的 程序是完全可移植的,您可以通过以下方式禁用 Microsoft 扩展 指定 ANSI 兼容的 /Za 命令行选项(编译为 ANSI 兼容性)在编译期间。当你这样做时, Microsoft 特定的关键字已禁用。

启用 Microsoft 扩展后,您可以使用 您的程序中的 Microsoft 特定关键字。为了符合 ANSI 标准, 这些关键字以双下划线。对于落后的 兼容性,单下划线所有的版本 双下划线关键字,除了 __except、__finally、__leave 和 支持 __try。此外,__cdecl 可以不带前导下划线。

__asm 关键字取代了 C++ asm 语法。 asm 保留用于 与其他 C++ 实现兼容,但未实现。使用 __asm。

__based 关键字对于 32 位和 64 位目标的用途有限 汇编。

虽然根据上面的引用,__int64 and _int64应该都可以工作,但是 Visual Studio 不提供语法突出显示_int64. But _int64也可以编译。

ADD 2

snprintf() 和 _snprintf() https://stackoverflow.com/questions/11579095/why-in-msvc-we-have-snprintf-while-other-compilers-allows-snprintf


  • 就Windows而言,打开文件的函数是CreateFile https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx。这会返回一个HANDLE由 Kernel32.dll 提供,而不是由 Visual Studio 提供。这HANDLE可以传递给其他 Windows API 函数。

  • The _open and open https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/open-wopen函数是 POSIX 兼容性函数,可帮助您在 Windows 上编译为 POSIX(Linux、macOS、BSD、Solaris 等)编写的程序。这些函数由 Visual Studio 的 C 运行时定义,并且可能调用CreateFile内部。该函数的 POSIX 名称是open,但这里的函数定义为_open如果您已经定义了一个名为的函数open在你的代码中。该函数返回一个int它可以传递给其他 POSIX 函数。在Windows上,这个接口是Visual Studio提供的兼容性API,但是在Linux和macOS上,这个接口是操作系统的直接接口,就像HANDLE在 Windows 上。

  • The fopen https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/fopen-wfopen函数是 C 标准的一部分。它由 Visual Studio 的 C 运行时定义,并且可能调用CreateFile内部。它返回一个FILE *它可以传递给 C 标准定义的其他函数。

因此,总结一下选项:

  • 如果你需要直接使用Windows API,比如调用GetFileInformationByHandle or CreateFileMapping, 你需要一个HANDLE你应该打电话CreateFile打开文件。

  • 如果您有一个已经为 POSIX 系统编写的程序,那么您可以使用open使您的程序更容易移植到 Windows。如果您只为 Windows 编写,那么使用此界面没有任何优势。

  • 如果您的程序只需要执行基本的文件操作,例如打开、读取和写入,那么fopen就足够了,它也适用于其他系统。 AFILE *可以(通常是)由您的应用程序缓冲并支持方便的操作,例如fprintf, fscanf, and fgets。如果你想打电话fgets在返回的文件上CreateFile or open你必须自己写。

可以将文件句柄从一种 API 转换为另一种 API,但您必须注意所有权问题。 “所有权”实际上并不是一个技术概念,它只是描述了谁负责管理对象的状态,并且您希望避免破坏不属于您的对象,并避免同一个对象有多个所有者。

  • 对于 Windows API,您可以使用_open_osfhandle()创建一个FILE * from a HANDLE, and _get_osfhandle()得到HANDLE来自FILE *。然而,在这两种情况下,句柄都将归FILE *.

  • 对于 POSIX API,您可以使用fdopen()创建一个FILE * from a int文件描述符,您可以使用fileno()得到int文件描述符来自FILE *。同样,在这两种情况下,文件都属于FILE *.

请注意,Windows 文件名是数组,因此可移植性变得复杂wchar_t,但 macOS / Linux / 等文件名是数组char.

如果您使用不同的 C 运行时(例如 MinGW),或者使用适用于 Linux 的 Windows 子系统,情况将会有所不同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

open()、_open() 和 fopen() 在 MSVC 编译器方面的区别? 的相关文章

  • Win32:将窗口置于顶部

    我有一个 Windows 程序 其中有两个 2 窗口 hwnd main interface hwnd2 toplevel window no parent created by hwnd 当我双击 hwnd 时 我需要弹出 hwnd2 并
  • 什么是 POSIX 合规性以及它对我有何影响?

    我不断看到这个问题出现 每次我查找它时 我都无法很好地解释它是什么或它对我意味着什么 什么是 POSIX 合规性 假设我的程序仅在兼容 POSIX 的机器上运行 这对我作为程序员来说有何简化 甚至吗 POSIX http pubs open
  • 基于 MSVC 10 范围的 for 循环

    目前 在我们正在开发的一个大型 C 项目中 我们有一堆新样式的 for 循环 如下所示 for auto value values 到目前为止 我们一直只使用 gcc 4 6 进行编译 最近 一些代码库正在移植到 Windows 一些开发人
  • Xenomai 中的周期性线程实时失败

    我正在创建一个周期性线程 它在模拟输出上输出方波信号 我正在使用 Xenomai API 中的 Posix Skin 和 Analogy 我使用示波器测试了代码的实时性能 并查看了方波信号 频率为 1kHz 的延迟 我应该实现 250us
  • 创建进程默认浏览器

    我目前正在使用 ShellExecute 打开 在用户浏览器中打开 URL 但在 Win7 和 Vista 中遇到了一些麻烦 因为该程序作为服务运行提升 我想获取线程 id 因此 ShellExecute 无法获取线程 id 因此我开始使用
  • pip install ecos 错误,显示“需要 Microsoft Visual C++ 14.0”。 [复制]

    这个问题在这里已经有答案了 我正在尝试使用 pip install 在我的 anaconda 中安装 fancyimpute 但错误显示由于 需要 Microsoft Visual C 14 0 而无法安装 ecos 提供的链接已过期 有谁
  • C++11 / VS2010:返回不可复制但可移动对象的容器

    考虑以下代码 include
  • 为什么 Mac OS 上的 C 运行时允许预组合和分解的 UTF-8?

    所以我们都知道 Mac OS 上的文件系统具有使用完全分解的 UTF 8 的古怪功能 如果您调用 POSIX API 例如realpath 例如 您将从 Mac OS 返回这样一个完全分解的 UTF 8 字符串 当使用像这样的 API 时f
  • Visual C++ 打开第二个窗体

    我有一个包含两个表单的项目 Form1 h 和 Form2 h 每个的 cpp 文件是test cpp 和Form2 cpp 我想通过单击按钮从第一个表单打开第二个表单 其中我已经有代码 放置在 button1 Click 方法内 Form
  • 抑制 makefile 中命令调用的回显?

    我为一个作业编写了一个程序 该程序应该将其输出打印到标准输出 分配规范需要创建一个 Makefile 当调用它时make run gt outputFile应该运行该程序并将输出写入一个文件 该文件的 SHA1 指纹与规范中给出的指纹相同
  • 通过不同 DLL 或 EXE 中的指针或引用访问 STL 对象时发生访问冲突

    我在使用旧版 VC6 时遇到以下问题 我只是无法切换到现代编译器 因为我正在处理遗留代码库 http support microsoft com kb 172396 http support microsoft com kb 172396
  • 赋值运算符“=”是原子的吗?

    我正在使用全局变量实现线程间通信 global var volatile bool is true true thread 1 void thread 1 while 1 int rint rand 10 if is true cout l
  • Visual C++ 找不到“Windows 类型”,如 PVOID、DWORD、ULONG 等

    Windows 似乎无法找到任何这些类型 我完全不知道该怎么办 我在 MSDN 上找到的东西似乎表明它们是默认包含的 但它们在 Native 程序或 CLR 程序中不起作用 我收到的具体错误是
  • 如何防止 VC++ 9 链接器链接不必要的全局变量?

    我正在玩功能级链接 http msdn microsoft com en us library xsa71f43 VS 80 aspx在VC 中 我已启用 OPT REF 和 OPT ICF http msdn microsoft com
  • “1个未解决的外部”C++

    我已经检查了所有文件之间的连接以及类和函数定义 但每次我尝试运行我的程序时 它都会阻止我并告诉我它有 1 个未解析的外部 该程序应该打开多个文件 一个 学生 文件和一个 成绩 文件 从中读取数据 然后使用 查询文件 来查找数据 找到查询中要
  • 霸权继承——真的很糟糕吗?

    我是那些必须在 0 警告的情况下编译代码的人之一 通常我尊重编译器 如果它向我发出警告 我会将其视为我应该稍微修改我的代码的标志 如果我必须告诉编译器忽略给定的警告 我会有点抽搐 但这件事我似乎无法回避 而且据我所知 我没有做过任何 坏事
  • SFINAE 无法有条件地编译成员函数模板

    我正在尝试你使用std enable if使用 SFINAE 和以下代码有条件地仅选择两个成员函数模板中的一个 include
  • 更改文件名时,录制开始会延迟 3 秒。

    在图中使用两个 ASFWriter 过滤器 一个正在制作 wmv 文件 另一个用于直播 进行流式传输 更改文件名时 录制开始会延迟 3 秒 所以 一个New WMV的头部丢失了 很烦恼啊 CAMERA InfTee 过滤器 AsfWrite
  • Visual Studio 2010 (C++):暂时抑制 C4706 警告

    当您在 Visual Studio 2010 中编译以下 C 源文件并启用警告级别 W4 时 include
  • Visual C++ free 和 malloc 的线程安全性?

    有谁知道 free 和 malloc 在 Visual C 2010 上是否是线程安全的 我遇到了奇怪的问题 内存被损坏 我几乎认为这是唯一的可能性 有谁知道安全装置是否可以打开和关闭以及如何打开和关闭 前提是您链接的是线程安全库 http

随机推荐

  • 将列表从 QSharedMemory 复制到 sip.voidptr 的 Pythonic 方法

    我正在使用 PyQT5 和 QSharedMemory 类 我正在创建一个可以容纳 6 个 1 字节元素的共享内存 为了将这些元素复制到共享内存数组中 我循环遍历 python 列表中的元素 如下所示 f shared mem data k
  • Windows批处理文件:查找目录,如果不存在,则创建,然后将文件移动到该目录

    我正在尝试创建一个批处理文件或其他脚本 以将一个文件夹的内容转移到另一个目录中包含其名称的文件夹中 例如 ShowName Episode Title mkv 应移至 movies showname 如果 movies showname 不
  • Powerpoint VBA 撤消

    我有 VBA 代码 可以处理 PowerPoint 文件中的许多幻灯片 部分代码临时调整幻灯片大小 以便我可以以不同的纵横比导出图像 我无法再次调整它们的大小 因为 PowerPoint 永远不会将它们的内容完全恢复到调整大小之前的样子 所
  • PHP:preg_match - “分隔符不能是字母数字或反斜杠”[重复]

    这个问题在这里已经有答案了 有谁知道这个正则表达式有什么问题吗 它在 RegexPal 和 RegExr 等网站上运行良好 但在 PHP 中它给我这个警告并且没有结果 Warning preg match function preg mat
  • 使用 constexpr-if 时出错:在 'constexpr' 之前预期有 '('

    我正在尝试使用 if constexpr 来检查某些内容 但遇到类似错误 constexpr 之前应有 前面没有 if 的 else 到目前为止我检查我的代码没有任何问题 我的编译标志是 g std c 17 main cpp includ
  • mac os x 下进程使用的内存

    给定PID 如何获取进程当前使用的内存 具体来说 我正在寻找 进程使用的私有物理内存 RAM 进程使用的交换空间 但我对映射文件和共享内存不感兴趣 简而言之 我想确定通过终止 PID 将释放多少内存 RAM 和交换 这有用吗 您可以使用ps
  • Django 中的 2 个表单、1 个视图、2 个 SQL 表

    我正在努力了解如何将两个 django 表单中的数据提交到两个单独的数据库表中相同的观点 我只想要一个提交按钮 尽管this https stackoverflow com questions 1395807 proper way to h
  • 一个按钮是否可以有 2 种不同的背景颜色(以及 css 按钮)

    我想要实现的就是这样的事情 你好 hi 位于两种颜色的中间 我让它适用于一种颜色和下面的另一种颜色 但希望颜色在文本中间分开 如果没有人能想出使用 css 的解决方案 我将使用按钮图像 尽量避免使用图像 编辑 当然CSS结果必须跨浏览器 即
  • 最后一个分叉的孩子不会死

    我的主进程分叉了两次 从而创建了两个子进程 这两个孩子是这样相互沟通的 ls more 现在的问题是 第二个孩子永远不会死 这是为什么 管道中的最后一个孩子什么时候真正死亡 删除一个wait 调用显示了预期结果ls more但给出了一些进一
  • 如何使用 SevenZipSharp 创建压缩的 SFX 文件?

    我将了解如何使用 SevenZipSharp 库创建 SFX 首先 我需要说我找不到任何属性来设置压缩级别 等等 当我尝试制作文件的 SFX 时 出现以下错误 Object reference not set to an instance
  • WinForms 中的 WPF 控件 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我是 NET 世界的新手 对 winform 的经验很少 我想知道是否可以将WPF与Winforms混
  • JavaScript 中 FileReader#readEntries 可以读取的目录最大文件数

    我正在创建一个 Chrome 应用程序 我必须读取目录的文件并且我正在使用目录入口API https developer mozilla org en US docs Web API DirectoryEntry and 目录读取器API
  • 如何创建一个程序来列出 Mac 中的所有 USB 设备?

    我对 Mac OS X 操作系统的接触有限 现在我开始使用 Xcode 并正在研究 I O 套件 我需要在命令行工具下在 Xcode 中创建一个程序 以便列出 Mac 系统中连接的所有 USB 设备 请有过这方面经验的人帮帮我 如果有人可以
  • Rails form_for collection_select 忽略 select_tag 接受的远程 ajax 调用

    在让我的表单助手工作之前 我使用以下内容作为我的选择下拉列表 这非常适合调用我的 filter by city js erb 并更新一些其他值 使用
  • Python 3.7:将代理应用于 pip 安装的所有部分,无法维护代理变量

    我有以下问题 我正在使用命令 pip install pyinstaller proxy http webdefence global blackspider com 80 trusted host pypi python org 我遇到的
  • 通过正则表达式进行不区分大小写的有序单词搜索

    我刚开始使用 Perl 中的正则表达式 在尝试了各种在线教程之后 我想要编写一个正则表达式来匹配顺序指定的不区分大小写的单词匹配 我正在尝试确定字符串 A 是否由字符串 B 的单词或单词序列组成 并且我想不区分大小写地执行此操作 例如 如果
  • React 无状态组件 - 性能和 PureRender

    大家都说用stateless组件将提高应用程序性能 然而 我注意到在错误的地方使用无状态组件真的会reduce应用性能 发生这种情况是因为无状态组件总是渲染 即使属性没有改变 如果是stateful我们可以使用的组件PureComponen
  • 如何居中和左对齐图像?

    我正在创建一个图像库 希望图像的容器完全居中在页面上 但图像保持对齐 这是我想要的输出 但是 当我尝试做一个text align center在容器上 id gallery 我得到的图像显示如下 我尝试效仿之前的堆栈溢出问题 CSS 居中块
  • 从 Gradle 开始 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我不知道像 Ant Maven 或
  • open()、_open() 和 fopen() 在 MSVC 编译器方面的区别?

    我发现这三个函数都与打开文件有关 open https msdn microsoft com en us library ms235491 v vs 120 aspx 此 POSIX 函数已弃用 使用符合 ISO C 标准的 open 反而