2012-04-27 20 views
13

Tengo un problema al transferir una herramienta Linux a Windows. Estoy usando MinGW en un sistema Windows. Tengo una clase que maneja toda la entrada/salida y dentro de esta línea es:mkdir Windows vs Linux

mkdir(strPath.c_str(), 0777); // works on Linux but not on Windows and when it is changed to 
_mkdir(strPath.c_str()); // it works on Windows but not on Linux 

Alguna idea de lo que puedo hacer, para que funcione en ambos sistemas?

+1

se puede averiguar qué sistema que se encuentra y utiliza la correcta. algo así como '#ifdef LINUX ... #else ... # endif' – twain249

+5

compilación condicional? –

+7

* A un lado *: Quiere decir '0777', no' 777'. Son números muy diferentes. –

Respuesta

26
#if defined(_WIN32) 
_mkdir(strPath.c_str()); 
#else 
mkdir(strPath.c_str(), 0777); // notice that 777 is different than 0777 
#endif 
+0

Thx, para la ayuda rápida – MindlessMaik

+2

"_WIN32 - Definido para aplicaciones para Win32 y Win64". (ref: http://msdn.microsoft.com/en-us/library/b0084kay.aspx) Por lo tanto, la comprobación de _WIN64 no es necesaria aquí. – cweston

+0

Como referencia, eso es bueno saberlo. La evaluación de cortocircuito lo hace discutible en este caso. – gcochard

3

Usted debe ser capaz de utilizar la compilación condicional a utilizar la versión que se aplica al sistema operativo que está compilando para.

Además, ¿está realmente seguro de que desea establecer las banderas en 777 (como en el caso de que esté abierto, por favor deposite su virus aquí)?

+0

+1 por 777 advertencia – Benj

+0

¡Vive peligrosamente! ;) – Jon

1

Puede compilar condicionalmente con algunas directivas del preprocesador, una lista bastante completa de lo que se puede encontrar aquí: C/C++ Compiler Predefined Macros

#if defined(_WIN32) 
    _mkdir(strPath.c_str()); 
#elif defined(__linux__) 
    mkdir(strPath.c_str(), 0777); 
// #else more? 
#endif 
+0

Y si es _WIN64 simplemente no hagas nada ??? –

+5

@EricJ. - '_WIN32' se define también en las ventanas de 64 bits. – birryree