2012-04-27 6 views
13

Ho un problema durante il porting di uno strumento Linux su Windows. Sto usando MinGW su un sistema Windows. Ho una classe che gestisce tutta l'in/uscita e all'interno di questa linea è: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 

Tutte le idee che posso fare, in modo che funzioni su entrambi i sistemi?

+1

si può capire quale sistema si è in e utilizzare quello corretto. qualcosa come '#ifdef LINUX ... #else ... # endif' – twain249

+5

Compilazione condizionale? –

+7

* A parte *: Si intende usare '0777', non' 777'. Sono numeri molto diversi. –

risposta

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

Thx, per l'aiuto rapido – MindlessMaik

+2

"_WIN32 - Definito per applicazioni per Win32 e Win64". (ref: http://msdn.microsoft.com/en-us/library/b0084kay.aspx) Pertanto il controllo per _WIN64 non è necessario qui. – cweston

+0

Per riferimento, è una grande cosa da sapere. Tuttavia, la valutazione del cortocircuito lo rende discutibile in questo caso. – gcochard

3

Dovresti essere in grado di utilizzare la compilazione condizionale per utilizzare la versione applicabile al sistema operativo per il quale stai compilando.

Inoltre, sei proprio sicuro di voler impostare i flag su 777 (come in wide open, si prega di depositare il virus qui)?

+0

+1 per 777 warning – Benj

+0

Live pericolosamente! ;) – Jon

1

È possibile condizionale compilare con alcune direttive del preprocessore, una lista abbastanza completa, di cui potete trovare qui: C/C++ Compiler Predefined Macros

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

E se è _WIN64 non fare nulla ??? –

+5

@EricJ. - '_WIN32' è definito anche in finestre a 64 bit. – birryree