将代码从Linux移植到MinGW

时间:2012-02-06 05:57:20

标签: c++ linux mingw portability preprocessor-directive

我正在编写一个小类,可以在PC上创建/删除/重命名/搜索文件和目录。

我成功编写了这个类并在Linux上运行。

当我尝试在MinGW中运行相同的类代码时,它出错了。 我可以缩小到: Linux中的mkdir函数,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 个答案:

答案 0 :(得分:2)

您可以编写类似

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

另见feature_test_macros(7)手册页。

答案 1 :(得分:1)

1)你可以使用预处理器在一个平台上做一件事,在另一个平台上做一些不同的事情。 EG:

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

2)是的,你是绝对正确的:限制尽可能多地使用它们。 你会很快发现你无法完全避免它们。

3)最好的办法是使用检查的脚本    功能而不是基于每个操作系统。    通常这涉及编写配置脚本(或    类似),这是一个完整的其他学习曲线。不过,它让    您通过检查功能而非端口移植到新平台    将平台添加到长列表中。