如何避免在多平台Qt代码中使用特定的#ifdef?

时间:2018-11-22 14:24:05

标签: c++ qt cross-platform multiplatform

我有一个QT输入侦听器类,该类在运行的stdin中发信号通知QCoreApplication输入。我想在Windows和Linux上都使用它。

我当前的方法是在标头和cpp中使用#ifdef Q_OS_WIN来执行特定于平台的代码。据我所知,#ifdef被认为是有害的,应避免使用,我想以一种只有单个头文件inputlistener.h的方式进行重构,并让构建系统在特定的{{1 }}或windows/inputlistener.cpp,也许还有一个额外的linux/inputlistener.cpp来保存代码,而不是特定于平台的。

但是,我找不到解决方案,如何避免标题中的inputlistener_global.cpp

我该如何实现?

这是我目前的做法:

#ifdef

2 个答案:

答案 0 :(得分:1)

您可以使用自己的实现来创建WinEventListenerUnixEventListener(或其他方式)(而不是尝试通过ifdefs使其适合),每个实现通用的Listener接口(并驻留在单独的文件中。

然后,具有一个工厂函数,该函数将返回适合于OS的侦听器。他们只有一个地方可能需要ifdefs。

但是,一般来说,ifdef可能是最好的或唯一的操作方法(例如,当您已经抽象了某些东西时)。条件编译是预处理器为数不多的有效/合理用法之一(正是它的用途)。

另外,在您的特定情况下,请确保Qt库中没有适当的代码/类。对于大多数常见的东西,已经存在现有的抽象(或推荐的抽象方法)。

答案 1 :(得分:1)

您可以为EventListener.cppwindows创建单独的unix文件,并将这些文件放到子目录中,例如(winlinux)。您可以在生成文件或项目文件中添加一个基于当前平台的实现文件。编译器将只为当前平台编译一个文件。

使用这种方法,您可以完全避免ifdef

如果定义不同,则可以使用pImpl惯用语来分隔类的实现细节:https://cpppatterns.com/patterns/pimpl.html