_open:这个 POSIX 函数已被弃用。请使用符合 ISO C++ 标准的 _open 替代。
fopen:打开一个文件。这些函数已被弃用,因为更安全的版本可用;请参阅 _sopen_s、_wsopen_s。
所以,为什么有三个版本?在什么情况下使用哪个版本?我认为 POSIX 很好,但为什么 MSDN 说打开一个文件。可用于执行额外参数验证并返回错误代码的更安全版本的这些函数;请参阅 fopen_s、_wfopen_s。
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
ADD 1
看起来单下划线前缀_XXX
是微软的惯例。例如_DEBUG,_CrtSetDbgFlag和上述的_open。一些引用自MSDN:
默认情况下启用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
也可以编译。
open()
并未被放弃使用。 - Stargateuropen()
函数。因此可以说MSVC不符合POSIX标准。 - Stargateuropen
可能会与用户名称冲突。而_open
使用了实现保留的名称。 3)open
是POSIX标准,所以如果你编写POSIX程序,就使用它。没有人使用微软的扩展_open
等。 4)微软对于C和POSIX标准来说是一个非常糟糕的参考。众所周知,他们有意违反这些标准(例如,MSVC自18年前起故意不符合标准(C99)。事实上,我记得他们甚至不能保证完全遵循C90。 5)如果你使用C进行编程,请使用像gcc或clang这样符合标准的编译器。 - too honest for this site