使用`#ifdef`或继承进行交叉编译会更好吗?

Nic*_*ton 6 c++ cross-platform conditional-compilation multiple-inheritance

从我之前关于虚拟和多重继承的问题(在跨平台场景中)开始 - 在阅读了一些答案后,我发现我可以通过保留服务器和客户端类来简化我的模型,并用以下内容替换特定于平台的类#ifdefs(这是我原本打算做的).

使用这段代码会更简单吗?这意味着至少会有更少的文件!缺点是它创造了一个有点"丑陋",并且稍微难以阅读的Foobar课程,因为这里到处#ifdefs都是.请注意,我们的Unix Foobar源代码永远不会传递给编译器,因此它具有相同的效果#ifdef(因为我们还#ifdef用来决定调用哪个特定于平台的类).

class Foobar {
public:
  int someData;

#if WINDOWS
  void someWinFunc1();
  void someWinFunc2();
#elif UNIX
  void someUnixFunc1();
  void someUnixFunc2();
#endif

  void crossPlatformFunc();
};

class FoobarClient : public Foobar;
class FoobarServer : public Foobar;
Run Code Online (Sandbox Code Playgroud)

注意:有些东西(ctor等)遗漏了一个更简单的例子.

更新:

对于那些想要更多地了解这个问题的人,我真的建议浏览相应的邮件列表线程.在第3篇文章开始变得有趣.还有一个相关的代码提交,您可以在此处查看有问题的真实代码.

Jam*_*mes 10

优选地,包含方法内操作的平台依赖性,因此类声明在不同平台上保持相同.(即在实现中使用#ifdefs)

如果你不能这样做,那么你的课应该是两个完全独立的课程,每个平台一个.


Nik*_*sov 5

我个人的偏好是将ifdef魔法推入make文件,因此源代码保持尽可能干净.然后每个平台都有一个实现文件.这当然意味着您可以为所有支持的系统提供通用接口.

编辑:

绕过这种较低分母设计进行跨平台开发的一种常见方法是不透明的句柄习语.与ioctl(2)转义路径相同的想法- 让一个方法返回为每个平台(最好是在实现文件中)定义不同的不透明前向声明结构,并且只在普通抽象不成立时才使用它.