ZXPoo 发表于 4 天前

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       

FishC 发表于 4 天前

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]
查看完整版本: Qt中包含windows.h和vikey.h重定义冲突