2012-02-06 2 views
0

Я пишу небольшой класс, который может создавать/удалять/переименовывать/искать файлы и каталоги на ПК.портирующий код от Linux до MinGW

Я успешно написал класс и работаю на Linux.

Когда я пытался запустить тот же класс кода в MinGW, он выдавал ошибку. Я мог бы сузить до: Функция mkdir в Linux, Cygwin имеет 2 аргумента (имя каталога, разрешения режима) , но в MinGW есть только один аргумент (имя каталога).

Мой запрос: a) Каков наилучший способ заставить код работать на обеих ОС. b) Хотя я никогда не пользовался, я слышал, что директивы препроцессора могут быть помещены как #ifdefined ..... # endif .. или что-то в этом роде. c) Использует директивы препроцессора хорошую практику программирования. Как я узнал, директивы препроцессора должны использоваться минимально.

Может кто-нибудь помочь мне в этом:

Вот мой код, который работает на Linux и Cygwin:

#include "BioDatabase.h" 
#include <dirent.h> 
#include <sys/stat.h> 
#include <stdio.h> 
#include <unistd.h> 


BioDatabase::BioDatabase() { 
    string s = getcwd(NULL,0); 
    changeDirectory(s,"*"); 
} 

BioDatabase::BioDatabase(string directoryName, string extension) 
{ 
    changeDirectory(directoryName, extension); 
} 

bool BioDatabase::createDirectory(string st) 
{ 
    if(mkdir(st.c_str(),0755) == -1) 
    { 
     cerr <<endl<<"BOSERR-BioDatabase, createDirectory: Path or file function not found or Permission denied\n\n"; 
     return false; 
    } 
    flag =1; 
    return true; 
} 

ответ

2

Вы могли кодировать что-то вроде

#if _POSIX_C_SOURCE 
    if(mkdir(st.c_str()) == -1) 
#else 
    if ((mkdir(st.c_str(),0755) == -1) 
#endif 

Смотрите также feature_test_macros(7) странице человека.

+0

Привет, это предложение сработало для меня. Огромное спасибо за помощь. – Prasad

1

1) вы можете использовать предварительные процессоры, чтобы сделать одну вещь на одной платформе, и что-то другое по другому. EG:

#ifdef mingw32 
/* windows specific code, like mkdir()... */ 
#else 
/* other platform code, like a different way to call mkdir() */ 
#endif 

2) Да, вы абсолютно правы: ограничьте их как можно больше. , но вы быстро узнаете, что не можете полностью их избежать.

3) Лучше всего использовать скрипт, который проверяет функциональность , а не делает это на основе операционной системы. Обычно это связано с написанием сценария configure (или ), который представляет собой целую другую кривую обучения. Тем не менее, он позволяет вы переносите на новые платформы, проверяя функциональность, а не , добавляя платформу в длинный список.

+0

Во-первых, спасибо за ответ. Я пробовал, но он все еще выдавал ту же ошибку. Как компилятор узнает, что mingw32 - это другой Os ?? В Command при компиляции мне нужно указать несколько флагов? Еще раз, спасибо. – Prasad

+0

У компиляторов есть предопределенные флаги много времени для обнаружения архитектуры, например '__linux__' и' mingw32'. Трюк, конечно же, всегда должен знать, какое именно имя вам нужно. –