Dar*_*kas 2 c++ cross-platform
在头文件中我定义了以下函数
#ifndef OS_H
#define OS_H
#include <string>
#include <vector>
int GetDirectoryFiles(std::string directory, std::vector<std::string> &files);
#endif /* OS_H */
Run Code Online (Sandbox Code Playgroud)
我希望每个平台都有单独的实现
#include "os.h"
#include <iostream>
#ifdef OSWIN
#include <windows.h>
#elif OSLINUX
#include <dirent.h>
#endif
int GetDirectoryFiles(std::string directory, std::vector<std::string> &files)
#ifdef OSLINUX
{
DIR *dp;
struct dirent *dirp;
if((dp = opendir(dir.c_str())) == NULL) {
cout << "Error(" << errno << ") opening " << dir << endl;
return errno;
}
while ((dirp = readdir(dp)) != NULL) {
files.push_back(string(dirp->d_name));
}
closedir(dp);
return 0;
}
#elif OSWIN
{
std::clog << "entered!" << std::endl;
WIN32_FIND_DATA FindFileData;
HANDLE hFind = FindFirstFile(directory.c_str(), &FindFileData);
if ( hFind == INVALID_HANDLE_VALUE )
return -1;
do {
files.push_back(FindFileData.cFileName);
} while(FindNextFile(hFind, &FindFileData) != 0);
FindClose( hFind );
return 0;
}
#endif
Run Code Online (Sandbox Code Playgroud)
是否有更优雅的方式来做到这一点(被认为是好的风格).
处理此问题的典型方法是在共享头文件中包含函数声明,然后每个平台有一个cpp文件,其中包含此函数的不同平台特定定义.然后,您的构建系统仅在相应的特定于平台的cpp文件中创建和链接.
即
Filesystem.h
#include <string>
#include <vector>
int GetDirectoryFiles(std::string directory, std::vector<std::string> &files);
Run Code Online (Sandbox Code Playgroud)
Filesystem_Windows.cpp:
#include "Filesystem.h"
int GetDirectoryFiles(std::string directory, std::vector<std::string> &files);
{
WIN32_FIND_DATA FindFileData;
HANDLE hFind = FindFirstFile(directory.c_str(), &FindFileData);
...
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Filesystem_Linux.cpp:
#include "Filesystem.h"
int GetDirectoryFiles(std::string directory, std::vector<std::string> &files);
{
DIR *dp;
struct dirent *dirp;
...
return 0;
}
Run Code Online (Sandbox Code Playgroud)
查看Qt的源代码树,这是一个非常流行的跨平台C++库,作为这种结构的一个例子.
归档时间: |
|
查看次数: |
268 次 |
最近记录: |