如何创建可以接受 Unix 和 Windows 标头的 C++ API?

问题描述

我正在为串行端口硬件构建一个 API,我希望这个 API 能够在 Unix 和 Windows 系统上运行。在 Windows 中我使用了 ,在 Unix 中我使用了

是否可以让使用我的 API 的人决定他使用的是哪个操作系统,然后使用该 API?还是应该为每个系统构建一个库?

我希望使用我的 API 的人在头文件中包含 unix 或 windows,然后这将决定他的硬件。这可能吗?

解决方法

通常,您会从定义用户界面到通用功能的单个标头开始。这无疑与您设计的有所不同,但大致上是这样的:

class SerialPort { 
    class Configuration {
         int bps;
         enum FlowControl { NONE,SOFTWARE,HARDWARE };
         // ...
    };

public:
    void open(std:string const &name);
    bool configure(Configuration const &config);
    bool read(char *buffer,size_t size);
    bool write(char const *buffer,size_t size);
    void close();
};

然后,您通常会为您正在执行的每个操作系统提供一个目录,以支持包含为该操作系统实现 ConfigurationSerialPort 类的代码。

然后在构建时,您将决定您的目标操作系统,并为该操作系统构建接口的实现。在某些情况下,您或多或少会明确地执行此操作,例如在构建时传递类似 OS=UNIXOS=WINDOWS 的内容。在其他情况下(特别是如果您使用像 CMake 这样的跨系统构建生成器),构建生成器本身会检测目标操作系统,并让您在构建脚本中简单地查询它。