gpt4 book ai didi

c++ - 如何在多平台qt代码中避免特定的#ifdef?

转载 作者:行者123 更新时间:2023-11-30 03:19:44 27 4
gpt4 key购买 nike

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

我目前的方法是在 header 和 cpp 中使用 #ifdef Q_OS_WIN 来执行特定于平台的代码。据我所知,#ifdef 被认为是有害的,应该避免,我想以一种方式重构它,我有一个头文件 inputlistener.h 并让构建系统在特定的 windows/inputlistener.cpplinux/inputlistener.cpp 之间进行选择,可能还有一个包含代码的附加 inputlistener_global.cpp ,这不是特定于平台的。

但是,我找不到解决方案,如何让 header 中的 #ifdef 不受影响。

我怎样才能做到这一点?

这是我目前的做法:

#inputlistener.h

#ifndef INPUTLISTENER_H
#define INPUTLISTENER_H

#include <QtCore>

class inputlistener : public QObject {
Q_OBJECT

private:
#ifdef Q_OS_WIN
QWinEventNotifier* m_notifier;
#else
QSocketNotifier* m_notifier;
#endif

signals:

void inputeventhappened(int keycode);

private slots:

void readyRead();

public:
inputlistener();
};

#endif // INPUTLISTENER_H

#inputlistener.cpp

#include "inputlistener.h"
#include "curses.h"

#ifdef Q_OS_WIN
#include <windows.h>
#endif

inputlistener::inputlistener()
{
#ifdef Q_OS_WIN
m_notifier = new QWinEventNotifier(GetStdHandle(STD_INPUT_HANDLE));
connect(m_notifier, &QWinEventNotifier::activated
#else
m_notifier = new QSocketNotifier(0, QSocketNotifier::Read, this);
connect(m_notifier, &QSocketNotifier::activated
#endif
,
this, &inputlistener::readyRead);

readyRead(); // data might be already available without notification
}

void inputlistener::readyRead()
{
// It's OK to call this with no data available to be read.
int c;
while ((c = getch()) != ERR) {
emit inputeventhappened(c);
}
}

最佳答案

您可以为 windowsunix 创建单独的 EventListener.cpp 文件,并将这些文件放入子目录中,例如 (winLinux)。您可以向 makefile 或 projectfile 添加一个基于当前平台的实现文件。编译器将只为当前平台编译一个文件。

使用此方法,您可以完全避免 ifdefing。

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

关于c++ - 如何在多平台qt代码中避免特定的#ifdef?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53433029/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com