C语言 具有三个参数的TypeDef

3mpgtkmj  于 2023-04-05  发布在  其他
关注(0)|答案(2)|浏览(132)

我正在阅读mimikatz的源代码,并努力理解这一点。
我看到KULL_M_REGISTRY_HIVE_HANDLE是结构体的别名,*PKULL_M_REGISTRY_HIVE_HANDLE是什么意思?

typedef struct _KULL_M_REGISTRY_HIVE_HANDLE
{
    HANDLE hFileMapping;
    LPVOID pMapViewOfFile;
    PBYTE pStartOf;
    PKULL_M_REGISTRY_HIVE_KEY_NAMED pRootNamedKey;
} KULL_M_REGISTRY_HIVE_HANDLE, *PKULL_M_REGISTRY_HIVE_HANDLE;
5t7ly7z5

5t7ly7z51#

如果你说

const int a, b;

你声明了两个const int类型的变量
如果你说

const int i, *p;

你声明了两个变量,一个是const int类型,另一个是“指向const int的指针”类型。
用一种完全类似的方式,如果你说

typedef struct { … } KULL_M_REGISTRY_HIVE_HANDLE, *PKULL_M_REGISTRY_HIVE_HANDLE;

你声明了两个typedef,一个用于类型struct,另一个用于指向那个结构的类型指针。
所以如果你以后说

PKULL_M_REGISTRY_HIVE_HANDLE kmrhp;

它会将kmrhp声明为指针,就像你说的那样

KULL_M_REGISTRY_HIVE_HANDLE *kmrhp;

附录:指针类型定义变得更有趣的一种方式是,如果你说

PKULL_M_REGISTRY_HIVE_HANDLE p1, p2;

它声明了 * 两个 * 指针,就好像你说

KULL_M_REGISTRY_HIVE_HANDLE *p1, *p2;
pu82cl6c

pu82cl6c2#

typedef将普通声明/定义转换为一个或多个类型别名的定义。
因此,

struct _KULL_M_REGISTRY_HIVE_HANDLE{ ... } 
      KULL_M_REGISTRY_HIVE_HANDLE, *PKULL_M_REGISTRY_HIVE_HANDLE;

(no typedef)将把KULL_M_REGISTRY_HIVE_HANDLE声明为struct _KULL_M_REGISTRY_HIVE_HANDLE类型的变量,并把PKULL_M_REGISTRY_HIVE_HANDLE声明为指向struct _KULL_M_REGISTRY_HIVE_HANDLE类型的对象的指针,
对于typedef,它使KULL_M_REGISTRY_HIVE_HANDLE成为struct _KULL_M_REGISTRY_HIVE_HANDLE类型的别名,并使PKULL_M_REGISTRY_HIVE_HANDLE成为struct _KULL_M_REGISTRY_HIVE_HANDLE*类型的别名。
typedef版本中声明变量的变量类型的别名)

**旁注:**使用以_开头的名称(尤其是_和大写字母)标记结构体是一种(常见的)不好的做法。这些名称是保留的。(_[a-z0-9]名称在filescope和标记命名空间中保留,_[A-Z_]名称在所有范围内保留。)我会保持简单,只为标记重用typedef名称(struct KULL_M_REGISTRY_HIVE_HANDLE)。

相关问题