Qt中包含windows.h和vikey.h重定义冲突
上面是.h代码,下面是报错#pragma once
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <QtWidgets/QMainWindow>
#include "ui_ViKeyTools.h"
#include <qtextedit.h>
#include "Vikey.h"
#include <qlabel.h>
#undef DWORD
#undef CHAR
#undef WCHAR
//#pragma comment (lib, "ViKey_X64_oMD.lib")
//#pragma comment (lib, "ViKey_X64_oMT.lib")
#pragma comment(lib, "legacy_stdio_definitions.lib")
#pragma comment (lib, "ViKey_X64_oMDd.lib")
#pragma comment (lib, "ViKey_X64_oMTd.lib")
class ViKeyTools : public QMainWindow
{
Q_OBJECT
public:
ViKeyTools(QWidget *parent = nullptr);
~ViKeyTools();
void showFullScreenImage(const QString& imagePath);
void disableInput(bool disable);
public slots:
void checkVikeyStatus();
protected:
bool event(QEvent* event) override;
private:
Ui::ViKeyToolsClass ui;
QTimer* timer;
QTextEdit* m_textEdit;
bool isVikeyConnected = false;
QLabel* m_fullScreenImageLabel;
QWidget* m_fullScreenWindow = nullptr;
};
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 C2371 “DWORD”: 重定义;不同的基类型 (编译源文件 main.cpp) ViKeyTools d:\vs2017\project\vikeytools\include\vikey.h 68
错误 C2371 “DWORD”: 重定义;不同的基类型 (编译源文件 ViKeyTools.cpp) ViKeyTools d:\vs2017\project\vikeytools\include\vikey.h 68
错误 C2371 “CHAR”: 重定义;不同的基类型 (编译源文件 ViKeyTools.cpp) ViKeyTools d:\vs2017\project\vikeytools\include\vikey.h 70
错误 C2371 “WCHAR”: 重定义;不同的基类型 (编译源文件 ViKeyTools.cpp) ViKeyTools d:\vs2017\project\vikeytools\include\vikey.h 71
警告 C4005 “CALLBACK”: 宏重定义 (编译源文件 ViKeyTools.cpp) ViKeyTools d:\vs2017\project\vikeytools\include\vikey.h 73
错误 C2371 “CHAR”: 重定义;不同的基类型 (编译源文件 main.cpp) ViKeyTools d:\vs2017\project\vikeytools\include\vikey.h 70
错误 C2371 “WCHAR”: 重定义;不同的基类型 (编译源文件 main.cpp) ViKeyTools d:\vs2017\project\vikeytools\include\vikey.h 71
警告 C4005 “CALLBACK”: 宏重定义 (编译源文件 main.cpp) ViKeyTools d:\vs2017\project\vikeytools\include\vikey.h 73
Qt中包含 windows.h 和 vikey.h 导致重定义冲突的解决方法
这个问题的根本原因是 windows.h 和 vikey.h 都定义了一些相同的类型(如 DWORD、CHAR、WCHAR 等),从而引发了重定义错误。
解决方案如下:
[*]方案一:调整头文件包含顺序
尽量先包含 windows.h,再包含 vikey.h,因为 vikey.h 可能没有做防重定义处理。
[*]方案二:在包含 vikey.h 之前定义宏屏蔽冲突类型
你可以在包含 vikey.h 之前定义一些宏,避免其重复定义类型。例如:
#define _WINDOWS_// 防止 vikey.h 再次定义 windows 类型
#include <windows.h>
#include "vikey.h"
[*]方案三:修改 vikey.h(不推荐)
如果你有权限修改 vikey.h,可以在其中加上类型定义的条件编译判断:
#ifndef DWORD
typedef unsigned long DWORD;
#endif
[*]方案四:使用命名空间或封装 vikey.h
将 vikey.h 的内容封装到一个单独的源文件中,避免在多个地方重复包含。
建议做法:
你可以尝试将 #include "vikey.h" 放在所有系统头文件之后,并确保不要手动 #undef DWORD 等类型,这样反而可能引发更多问题。
示例修改:
#pragma once
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <QMainWindow>
#include "ui_ViKeyTools.h"
#include <QTimer>
#include "Vikey.h"
#include <QTextEdit>
#include <QLabel>
注意:不要在头文件中使用 #undef DWORD、#undef CHAR 等操作,这会破坏类型定义。
如果还有问题,欢迎继续贴出 vikey.h 的相关内容,我可以帮你进一步分析。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]