我看到这三个功能都与打开文件有关。
打开:
此 POSIX 函数已弃用。请改用符合 ISO C++ 标准的 _open。
_打开:
打开一个文件。这些功能已被弃用,因为有更安全的版本可用;见_sopen_s,_wsopen_s。
开放:
打开一个文件。这些执行附加参数验证和返回错误代码的函数的更安全版本可用;参见 fopen_s、_wfopen_s。
那么,为什么会有三个呢?什么时候用哪个?我认为 POSIX 很好,但为什么 MSDN 说不open
推荐使用 POSIX 版本?是否有任何与前导下划线相关的命名约定,以便我可以根据它的第一个外观选择正确的函数?
当我查看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
加 1
似乎单个下划线前缀_XXX
是微软的惯例。比如_DEBUG、_CrtSetDbgFlag和前面提到的_open。引用MSDN的一些话:
在 Microsoft C++ 中,带有两个前导下划线的标识符保留用于编译器实现。因此,Microsoft 约定是在 Microsoft 特定关键字之前使用双下划线。这些词不能用作标识符名称。
默认情况下启用 Microsoft 扩展。为确保您的程序完全可移植,您可以在编译期间通过指定 ANSI 兼容的 /Za 命令行选项(为 ANSI 兼容性而编译)来禁用 Microsoft 扩展。执行此操作时,Microsoft 特定的关键字将被禁用。
启用 Microsoft 扩展后,您可以在程序中使用 Microsoft 特定的关键字。为了符合 ANSI,这些关键字以双下划线开头。为了向后兼容,支持除 __except、__finally、__leave 和 __try 之外的所有双下划线关键字的单下划线版本。此外,__cdecl 可以不带前导下划线。
__asm 关键字替换了 C++ asm 语法。asm 保留用于与其他 C++ 实现兼容,但未实现。使用 __asm。
__based 关键字对 32 位和 64 位目标编译的用途有限。
虽然根据上面的引用,__int64
应该_int64
都可以工作,但是 Visual Studio 没有为_int64
. 但_int64
也可以编译。