Diferença entre open (), _open () e fopen () em relação ao compilador MSVC?

Vejo que essas três funções estão relacionadas à abertura de um arquivo.

abrir:

Esta função POSIX está obsoleta. Use o ISO C ++ em conformidade _open.

_abrir:

Abre um arquivo. Essas funções estão obsoletas porque estão disponíveis versões mais seguras; consulte _sopen_s, _wsopen_s.

abrir:

Abre um arquivo. Versões mais seguras dessas funções que executam validação de parâmetro adicional e códigos de erro de retorno estão disponíveis; veja fopen_s, _wfopen_s.

Então, por que existem três? Quando usar qual? Eu pensei que o POSIX é bom, mas por que o MSDN diz que a versão do POSIX doopen está obsoleto? E existe algumconvenção de nomes relacionado ao sublinhado principal para que eu possa escolher a função correta com base em sua primeira procura?

E quando eu estou olhando para oCódigo ACPICA, Vejo o código abaixo: Parece que o_XXX versão pode desativar algunsExtensões de idioma MS, o que exatamente são essas extensões?

/*
 * 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
ADICIONAR 1

Parece o único prefixo sublinhado_XXX é uma convenção da Microsoft. Tal como_DEPURAR, _CrtSetDbgFlag, e o mencionado acima_abrir. Algumas citações doMSDN:

No Microsoft C ++, identificadores com dois sublinhados principais são reservados para implementações de compilador. Portanto, a convenção da Microsoft é preceder palavras-chave específicas da Microsoft com sublinhado duplo. Essas palavras não podem ser usadas como nomes de identificador.

As extensões da Microsoft estão ativadas por padrão. Para garantir que seus programas sejam totalmente portáteis, você pode desativar as extensões da Microsoft especificando a opção de linha de comando / Za compatível com ANSI (compilação para compatibilidade com ANSI) durante a compilação. Quando você faz isso, as palavras-chave específicas da Microsoft são desabilitadas.

Quando as extensões da Microsoft estão ativadas, você pode usar as palavras-chave específicas da Microsoft em seus programas. Para conformidade com ANSI, essas palavras-chave são precedidas por umsublinhado duplo. Para compatibilidade com versões anteriores,sublinhado único são suportadas versões de todas as palavras-chave com sublinhado duplo, exceto __except, __finally, __leave e __try. Além disso, __cdecl está disponível sem sublinhado à esquerda.

A palavra-chave __asm substitui a sintaxe C ++ asm. o asm está reservado para compatibilidade com outras implementações de C ++, mas não implementado. Use __asm.

A palavra-chave com base em __ tem usos limitados para compilações de destino de 32 e 64 bits.

Embora de acordo com a citação acima,__int64 e_int64 devem funcionar, mas o Visual Studio não fornece destaque de sintaxe para_int64. Mas_int64 também pode compilar.

ADICIONAR 2

snprintf () e _snprintf ()

questionAnswers(1)

yourAnswerToTheQuestion