【问题标题】:Conflicting types interchanging void * and HINSTANCE交换 void * 和 HINSTANCE 的冲突类型
【发布时间】:2020-11-09 01:20:21
【问题描述】:

对于我的 win32 代码,我想不使用 windows typedefs。细读Windows Data Types 显示HINSTANCEvoid *。据我所知,MSDN 可能会过时,检查 Windows 10 SDK 内部的 shared\wtypes.h 会发现 typedef void *HINSTANCE

以下编译失败,返回error: conflicting types in WinMain

int __stdcall
WinMain(void *instance, void *prev_instance, char *cmd_line , int cmd_show)
{
  return 0;
}

我使用 clang++ 和 windows 头文件进行编译。

void * 更改为HINSTANCE 当然可以解决问题。但是,为什么会这样呢?

【问题讨论】:

  • #define STRICT 0。但显然你还没有接近替换那些 typedef。

标签: c++ winapi typedef


【解决方案1】:

不确定您是如何找到该定义的。我有:

DECLARE_HANDLE(HINSTANCE);

在哪里

#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name

回复:@chriscomment - 有趣!如果没有STRICT,我可以使用void* 而不是HINSTANCE 构建良好。

【讨论】:

  • HINSTANCE 在未定义 STRICT 时定义为 void*,在定义 STRICT 时定义为 struct HINSTANCE__*DECLARE_HANDLE() 宏的目的是在声明各种不同的句柄类型时进行区分。
  • @RemyLebeau 我明白了。我不知道STRICT 符号。我假设它是 Windows 标头的附加功能(在 Window 的历史过程中,不一定是最近的),否则为什么 MSDN 会列出非严格的 typedef?
  • @RyanMcClue 请参阅您链接之前的 MSDN 页面。 STRICT Compliance: "禁用 STRICT,所有句柄类型生成相同的基类型。启用 STRICT,它们生成不同的基类型。".
  • @dxiv 谢谢,我现在明白了。在数据类型页面上显示该注释对我来说似乎更合适。毕竟,当您粗略搜索数据类型时,所有页面都会出现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-29
  • 2013-08-04
  • 2021-06-10
  • 1970-01-01
  • 2021-01-20
  • 2018-03-28
  • 1970-01-01
相关资源
最近更新 更多