鱼C论坛

 找回密码
 立即注册
查看: 66|回复: 1

Qt中包含windows.h和vikey.h重定义冲突

[复制链接]
发表于 前天 12:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
上面是.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       
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 前天 12:13 | 显示全部楼层
Qt中包含 windows.h 和 vikey.h 导致重定义冲突的解决方法

这个问题的根本原因是 windows.hvikey.h 都定义了一些相同的类型(如 DWORDCHARWCHAR 等),从而引发了重定义错误。

解决方案如下:

  • 方案一:调整头文件包含顺序  
    尽量先包含 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-2 05:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表