定义指向空结构的指针与 C 中的强类型有什么关系?

问题描述 投票:0回答:2

我在某处读过这段代码片段,但我无法理解它的含义。

/** Use strong typing for ODP types */
#define odp_handle_t struct {} *  

上面的代码片段有何意义?

c strong-typing
2个回答
2
投票

此代码片段定义了符号 odp_handle_t,它表示资源的不透明句柄。它是不透明的,因为它是指向空结构的指针。它所指向的东西不会暴露给用户。它被称为句柄,因为它不直接指向资源,而只是标识它。内部实现知道如何使用该句柄来访问所需的资源。这有助于保持客户端代码和 API 实现之间的独立性。最后,强类型部分来自于这样一个事实:它是一个指向类型(空结构)的指针,而不是一个 void 指针。


1
投票

这只是一些与强类型无关的无意义代码。这似乎是声明指向不完整类型的指针的某种非标准方式,但它不是有效的 C。

#define odp_handle_t struct {} *  

odp_handle_t x; // will not compile, struct has no members

我相信这是另一个毫无意义的 gcc 扩展。另外,将指针隐藏在 typedef 后面始终是一个非常糟糕的主意。

没有理由不能使用纯标准 C 声明指向不完整/不透明类型的指针,并且无需将指针隐藏在 typedef 后面即可这样做:

.h 文件

typedef struct odp_handle_t odp_handle_t;

c 文件

struct odp_handle_t
{
  // have to put struct members in here
};

调用者c文件

odp_handle_t *pointer_to_incomplete_type;
© www.soinside.com 2019 - 2024. All rights reserved.