¿Diferencia entre open (), _open () y fopen () con respecto al compilador MSVC?

Veo que estas 3 funciones están relacionadas con la apertura de un archivo.

abierto:

Esta función POSIX está en desuso. Utilice el _Open conforme ISO C ++ en su lugar.

_abierto:

Abre un archivo Estas funciones están en desuso porque hay versiones más seguras disponibles; ver _sopen_s, _wsopen_s.

fopen:

Abre un archivo Están disponibles versiones más seguras de estas funciones que realizan validación de parámetros adicionales y códigos de error de retorno; ver fopen_s, _wfopen_s.

Entonces, ¿por qué hay tres de ellos? ¿Cuándo usar cuál? Pensé que POSIX es bueno, pero por qué MSDN dice la versión POSIX deopen ¿es obsoleto? Y hay algunaconvenio de denominación relacionado con el guión bajo para que pueda elegir la función correcta en función de su primer vistazo?

Y cuando estoy mirando elCódigo ACPICA, Veo el código a continuación: Parece que el_XXX la versión puede desactivar algunosExtensiones de lenguaje MS, ¿qué son exactamente estas extensiones?

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

Parece el prefijo de subrayado único_XXX es una convención de Microsoft. Como_DEPURAR, _CrtSetDbgFlag, y lo anterior_abierto. Alguna cita delMSDN:

En Microsoft C ++, los identificadores con dos guiones bajos principales están reservados para las implementaciones del compilador. Por lo tanto, la convención de Microsoft es preceder a las palabras clave específicas de Microsoft con guiones bajos dobles. Estas palabras no pueden usarse como nombres identificadores.

Las extensiones de Microsoft están habilitadas de forma predeterminada. Para asegurarse de que sus programas sean totalmente portátiles, puede deshabilitar las extensiones de Microsoft especificando la opción de línea de comandos compatible con ANSI / Za (compilar para compatibilidad ANSI) durante la compilación. Cuando hace esto, las palabras clave específicas de Microsoft se deshabilitan.

Cuando las extensiones de Microsoft están habilitadas, puede usar las palabras clave específicas de Microsoft en sus programas. Para cumplir con ANSI, estas palabras clave están precedidas por undoble subrayado. Para compatibilidad con versiones anteriores,subrayado simple Se admiten versiones de todas las palabras clave con doble subrayado, excepto __except, __finally, __leave y __try. Además, __cdecl está disponible sin guiones bajos.

La palabra clave __asm reemplaza la sintaxis asm de C ++. asm está reservado para la compatibilidad con otras implementaciones de C ++, pero no está implementado. Usa __asm.

La palabra clave basada en __ tiene usos limitados para las compilaciones de destino de 32 bits y 64 bits.

Aunque según la cita anterior,__int64 y_int64 ambos deberían funcionar, pero Visual Studio NO proporciona resaltado de sintaxis para_int64. Pero_int64 puede compilar también.

AGREGAR 2

snprintf () y _snprintf ()

Respuestas a la pregunta(1)

Su respuesta a la pregunta