这个C++宏的含义是什么?

2024-03-31

我不明白这个宏的含义:

#define DECLARE_HANDLE(n) typedef struct n##__{int i;}*n

DECLARE_HANDLE(HWND);

我从中学到了C程序:

“##”表示连接参数。

所以宏等于:

typedef struct HWND__{int i;}*HWND

这是正确的吗?

如果是的话,那这句话的含义是什么?

=================

来自游戏 Bombermaaan 的代码(适用于 Windows 和 Linux),
link http://sourceforge.net/p/bombermaaan/code/HEAD/tree/trunk/src/Bombermaaan/winreplace.h http://sourceforge.net/p/bombermaaan/code/HEAD/tree/trunk/src/Bombermaaan/winreplace.h,
第 90 行。


该构造的主要目的是防止误用句柄。如果所有句柄都是简单的void * or int or long long或其他一些基本类型,没有什么可以阻止您使用其中一种而不是另一种。一个指向a的指针struct HWND__并指向struct HBITMAP__不是同一件事,所以如果您有以下代码:

HWND hwnd;
HBITMAP hbmp;

hbmp = GetBitmap(...);
hwnd = hbmp;    // gives compiler error. 

这是一种相当经典的技术,可确保您获得 API 供应商不想提供真实声明的内容的唯一类型。尽管我不完全确定为什么他们甚至需要正确的结构声明,但您可能会逃脱:

#define DECLARE_HANDLE(n) struct n ## __; struct n ## __ *n;

这也将确保任何取消引用 HWND 都是不可能的,因为编译器将反对“使用不完整类型”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

这个C++宏的含义是什么? 的相关文章

随机推荐

  • 为什么 Python 中字典中的项目顺序会改变? [复制]

    这个问题在这里已经有答案了 我正在尝试从一些教程中学习Python 这是我遇到的一个让我困惑的简单例子 gt gt gt d server mpilgrim database master uid sa pwd secret gt gt g
  • Web Worker 和 Canvas 数据

    我看过很多关于网络工作者的帖子
  • 带按钮控件的 DataGridView - 删除行

    我想要在每行的末尾有一个删除按钮DataGridView通过单击我想从绑定列表中删除所需的行 该绑定列表是我的网格的数据源 但我似乎无法做到这一点 我在产品类中创建了一个按钮对象 并使用唯一的 id 实例化它以从列表中删除该对象 但按钮未显
  • 如何桥接 JavaScript(参差不齐)数组和 std::vector> 对象?

    在 JavaScript 中 我有一个 线 列表 每条线都由不定数量的 点 组成 每个点都有以下形式 x y 所以它是一个 3D 参差不齐的数组 现在我需要在 emscripten 的帮助下将它传递给我的 C 代码 embind https
  • Nuget Push 总是返回 404(未找到)

    我尝试将 nuget 包发布到我的 GitHub Packages 帐户 但在所有情况下我都会遇到 404 错误 我已按照 GitHub 网站上的要求进行操作 nuget source Add Name GitHub Source http
  • 限制异步任务

    我想运行一堆异步任务 并限制在任何给定时间可以等待完成的任务数量 假设您有 1000 个 URL 并且您只想一次打开 50 个请求 但是 一旦一个请求完成 您就会打开与列表中下一个 URL 的连接 这样 每次始终打开 50 个连接 直到 U
  • Spring Security 使用有效的 JWT 返回 403

    我正在使用 Postman 来测试我在 Spring Boot 2 2 6 中使用 Spring Security 创建的简单 OAuth2 API 我在请求新用户凭据时成功收到 JWT 但当我尝试使用标头中的此令牌访问它们时 我的所有端点
  • 如何使用2个sql请求和数据集中的2个数据表在水晶报表中显示数据?

    我有一个包含 2 个数据表 a 的数据集 我需要使用 2 个 sql 请求在水晶报表中显示数据 因此 我在数据集中创建了 2 个数据表 DataTable1 和 dataTable2 我尝试了这段代码 但它总是执行第二个 sql 请求 co
  • 给定两个表,从一个表中选择所有数据,并仅从另一个表中选择最新的数据

    我正在尝试构建一个论坛网站 该网站使用 PHP 和 MySQL 数据库来存储其类别和主题内容 在主页上 我想要一个表格 显示所有类别的列表以及每个类别中最近发布的主题 我想编写一个查询 该查询返回类别表中的所有类别 并且仅返回主题表中每个类
  • Illuminate\Support\MessageBag::has() 缺少参数 1

    当我访问我的 Laravel 项目时 它返回以下错误 如何解决它 Missing argument 1 for Illuminate Support MessageBag has called in var www laravel vend
  • MySQL SUM 多列

    我还有一个关于总和的问题 我想对一支棒球队的得分进行求和 将作为本地球员打球时的得分与作为访客打球时的得分相加 匹配表是这样的 Baseball matches Id IdTeamHome IdTeamAway ScoreHome Scor
  • 正则表达式匹配字符串的一部分,但不匹配整个字符串

    这是我用来验证可以包含小写和大写字母 数字和破折号的字符串的正则表达式 a zA Z0 9 其结果如下 abd 火柴 abcd 火柴 abcd0 火柴 abcd0 火柴 abc 不匹配 正确 abc efg 匹配 不正确 不应该 我究竟做错
  • 在 Windows 上编译 Erlang 代码

    我安装了 Erlang 13B 并尝试按照教程进行操作 每次我到达c tut 我得到一个错误而不是 ok tut 所以看起来没有安装任何模块 有人能指出我正确的方向吗 我尝试过 Emacs 但我真的不知道如何使用它 甚至还没有接近让 Erl
  • OpenGL ES 2.0 中的 glTexGen

    我已经尝试了几个小时来用 GL OBJECT LINEAR 实现 glTexGen 的 GLSL 替换 对于 OpenGL ES 2 0 在 Ogl GLSL 中 有 gl TextureMatrix 使这变得更容易 但这在 OpenGL
  • 将对象直接流式传输到 std::string

    给定某种可流式传输的类型 struct X int i friend std ostream operator lt lt std ostream os X const x return os lt lt X lt lt x i lt lt
  • 在 Python 中嵌套函数会产生开销吗?

    在Python中 如果我在父函数中有一个子函数 那么每次调用父函数时子函数是否都会 初始化 创建 将一个函数嵌套在另一个函数中是否会产生任何性能开销 代码对象是预编译的 因此该部分没有开销 函数对象在每次调用时构建 它将函数名称绑定到代码对
  • 在 WPF 中仅画刷椭圆的部分

    我无法找到绘制以下形状的最佳方法 我正在使用下面的代码来绘制Ellipse在视觉层上 但我怎么可能只刷宿舍呢 我认为可以使用LinearGradientBrush or RadialGradientBrush但我不知道如何使用它 var c
  • ActiveMQ NMS:当代理关闭时,connection.start() 会因故障转移协议而挂起

    我有使用 nms activemq 1 5 0 的 C 应用程序 当我的应用程序启动时 它尝试使用故障转移协议连接到代理 我有两个主从配置的代理 如果两个经纪人都关闭了 我的应用程序就会因为以下原因而陷入等待状态 connection st
  • 流行的源代码控制系统如何区分二进制文件和文本文件

    寻找有关不同源代码控制系统如何区分 或检测 文件类型 二进制与文本 的文章 文档或直观知识 特别令人感兴趣的是 Git 与 Mercurial 相比是如何做到这一点的 他们是否看 文件扩展名 文件签名或内容 即该文件是否为 UTF8 各种东
  • 这个C++宏的含义是什么?

    我不明白这个宏的含义 define DECLARE HANDLE n typedef struct n int i n DECLARE HANDLE HWND 我从中学到了C程序 表示连接参数 所以宏等于 typedef struct HW