我有一个QT输入侦听器类,该类在运行的stdin
中发信号通知QCoreApplication
输入。我想在Windows和Linux上都使用它。
我当前的方法是在标头和cpp中使用#ifdef Q_OS_WIN
来执行特定于平台的代码。据我所知,#ifdef
被认为是有害的,应避免使用,我想以一种只有单个头文件inputlistener.h
的方式进行重构,并让构建系统在特定的{{1 }}或windows/inputlistener.cpp
,也许还有一个额外的linux/inputlistener.cpp
来保存代码,而不是特定于平台的。
但是,我找不到解决方案,如何避免标题中的inputlistener_global.cpp
。
我该如何实现?
这是我目前的做法:
#ifdef
答案 0 :(得分:1)
您可以使用自己的实现来创建WinEventListener
和UnixEventListener
(或其他方式)(而不是尝试通过ifdefs使其适合),每个实现通用的Listener
接口(并驻留在单独的文件中。
然后,具有一个工厂函数,该函数将返回适合于OS的侦听器。他们只有一个地方可能需要ifdefs。
但是,一般来说,ifdef
可能是最好的或唯一的操作方法(例如,当您已经抽象了某些东西时)。条件编译是预处理器为数不多的有效/合理用法之一(正是它的用途)。
另外,在您的特定情况下,请确保Qt库中没有适当的代码/类。对于大多数常见的东西,已经存在现有的抽象(或推荐的抽象方法)。
答案 1 :(得分:1)
您可以为EventListener.cpp
和windows
创建单独的unix
文件,并将这些文件放到子目录中,例如(win
,linux
)。您可以在生成文件或项目文件中添加一个基于当前平台的实现文件。编译器将只为当前平台编译一个文件。
使用这种方法,您可以完全避免ifdef
。
如果定义不同,则可以使用pImpl
惯用语来分隔类的实现细节:https://cpppatterns.com/patterns/pimpl.html