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篇文章开始变得有趣.还有一个相关的代码提交,您可以在此处查看有问题的真实代码.
我个人的偏好是将ifdef
魔法推入make文件,因此源代码保持尽可能干净.然后每个平台都有一个实现文件.这当然意味着您可以为所有支持的系统提供通用接口.
绕过这种较低分母设计进行跨平台开发的一种常见方法是不透明的句柄习语.与ioctl(2)
转义路径相同的想法- 让一个方法返回为每个平台(最好是在实现文件中)定义不同的不透明前向声明结构,并且只在普通抽象不成立时才使用它.
归档时间: |
|
查看次数: |
1711 次 |
最近记录: |