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.
Esta função POSIX está obsoleta. Use o ISO C ++ em conformidade _open.
Abre um arquivo. Essas funções estão obsoletas porque estão disponíveis versões mais seguras; consulte _sopen_s, _wsopen_s.
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 1Parece 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.