C++ 如何使用###T理解C宏

C++ 如何使用###T理解C宏,c++,c,macros,typedef,C++,C,Macros,Typedef,我在vulcan.h文件(头文件)中找到了那个宏。我该怎么理解呢 #define VK_DEFINE_HANDLE(object) typedef struct object##_T* object; 尤其是双重散列的作用是什么 与(不同的星号位置)相比,其区别: 我知道这是结构类型定义,但该结构的主体在哪里 这个##是预处理器。它正在从对象宏形式名称构建一个新标记 所以VK\u DEFINE\u HANDLE(foo)可能(也可能是,除非foo\u T或foo扩展为其他内容)扩展为 typ

我在vulcan.h文件(头文件)中找到了那个宏。我该怎么理解呢

#define VK_DEFINE_HANDLE(object) typedef struct object##_T* object; 
尤其是双重散列的作用是什么

与(不同的星号位置)相比,其区别:

我知道这是结构类型定义,但该结构的主体在哪里

这个
##
是预处理器。它正在从
对象
宏形式名称构建一个新标记

所以
VK\u DEFINE\u HANDLE(foo)
可能(也可能是,除非
foo\u T
foo
扩展为其他内容)扩展为

typedef struct foo_T *foo;
可能还有其他东西(可能是其他宏扩展)正在定义
struct foo\u T

阅读的文档,例如
#
是预处理器。它正在从
对象
宏形式名称构建一个新标记

所以
VK\u DEFINE\u HANDLE(foo)
可能(也可能是,除非
foo\u T
foo
扩展为其他内容)扩展为

typedef struct foo_T *foo;
可能还有其他东西(可能是其他宏扩展)正在定义
struct foo\u T


请阅读的文档,例如

星号的位置应该无关紧要,如果您是这样问的话。至于
##
,它只是将
对象的值与固定字符串
\u T
连接起来。因此,如果
object
xyz
,则会得到
xyz\u T
。真正的问题是,这是一种允许类型检查无效指针或泛型指针的技术。正如宏所说,它声明的句柄通常声明为
void*thishHandle
void*thathHandle
。现在,如果在代码中交换它们,编译器将不会发出错误或警告。技巧是不使用void指针,而是使用指向不完整结构的指针。这样,您仍然无法访问句柄数据,但编译器可以执行类型检查。宏是一种自动使用的工具。@Frankie_C感谢您的解释。对我来说很有用。如果你是这么问的话,星号的位置应该无关紧要。至于
##
,它只是将
对象的值与固定字符串
\u T
连接起来。因此,如果
object
xyz
,则会得到
xyz\u T
。真正的问题是,这是一种允许类型检查无效指针或泛型指针的技术。正如宏所说,它声明的句柄通常声明为
void*thishHandle
void*thathHandle
。现在,如果在代码中交换它们,编译器将不会发出错误或警告。技巧是不使用void指针,而是使用指向不完整结构的指针。这样,您仍然无法访问句柄数据,但编译器可以执行类型检查。宏是一种自动使用的工具。@Frankie_C感谢您的解释。对我很有用。