¿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.
Esta función POSIX está en desuso. Utilice el _Open conforme ISO C ++ en su lugar.
Abre un archivo Estas funciones están en desuso porque hay versiones más seguras disponibles; ver _sopen_s, _wsopen_s.
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 1Parece 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.