0

PC上のファイルとディレクトリを作成/削除/名前変更/検索できる小さなクラスを書いています。

私はクラスを正常に作成し、Linuxで実行しました。

MinGWで同じクラスコードを実行しようとすると、エラーが発生していました。Linuxではmkdir関数、Cygwinには2つの引数(ディレクトリ名、モード権限)がありますが、MinGWでは1つの引数(ディレクトリ名)しかありません。

私の質問は次のとおりです。a)両方のOSでコードを機能させるための最良の方法は何ですか。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;
}
4

2 に答える 2

2

あなたは次のようなものをコーディングすることができます

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

feature_test_macros(7)のマニュアルページも参照してください。

于 2012-02-06T06:08:43.153 に答える
1

1)プリプロセッサを使用して、あるプラットフォームで1つのことを実行し、別のプラットフォームで別のことを実行できます。例えば:

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

2)はい、あなたは絶対に正しいです:あなたができる限りそれらを使用することを制限してください。 しかし、それらを完全に回避することはできないことがすぐにわかります。

3)最善の方法は、オペレーティングシステムごとに実行するのではなく、機能をチェックするスクリプトを使用することです。通常、これには、まったく別の学習曲線である構成スクリプト(または同様のもの)の記述が含まれます。それでも、プラットフォームを長いリストに追加するのではなく、機能をチェックすることで、新しいプラットフォームに移植できます。

于 2012-02-06T06:08:15.293 に答える