在c ++中为每个平台定义函数的首选方法是什么

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)

是否有更优雅的方式来做到这一点(被认为是好的风格).

And*_*zos 5

处理此问题的典型方法是在共享头文件中包含函数声明,然后每个平台有一个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++库,作为这种结构的一个例子.