【问题标题】:What is strong typing in c?c语言中的强类型是什么?
【发布时间】:2015-08-15 18:33:00
【问题描述】:

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

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

上面的代码sn-p有什么意义?

【问题讨论】:

标签: c linux strong-typing


【解决方案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;

【讨论】:

  • 你会在里面放什么结构成员?
  • @HadiBrais 程序需要保存为私有变量的任何内容,既不公开也不提供给调用者。
  • @Ludin 到底喜欢什么?我见过的所有类型的句柄都被定义为空指针或空结构指针。
  • @HadiBrais “句柄”是指向不完整类型的指针。结构定义中的内容完全取决于特定的应用程序。以标准 C 中的FILE 句柄为例,它很可能就是以这种方式实现的。对用户来说,它只是某种抽象指针,但对编译器实现来说,它会指向很多关于打开文件的内部信息。
  • FILE 不是句柄。从 C 标准的第 7.21.1 和 7.21.3 节开始,它被定义为表示访问文件的流的对象类型。通过查看它在 stdio.h 中的定义,我们可以看到它是一个完整的类型。文件句柄是一个称为 int 类型的 _file 类型的字段,有时也用作句柄类型。
【解决方案2】:

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

【讨论】:

  • 请注意,标准 C 中没有“指向空结构的指针”之类的东西。
  • 是的,你是对的。我只是假设他正在使用 gcc,其中定义了空结构和指向它们的指针。
猜你喜欢
  • 2013-02-03
  • 2010-09-12
  • 2016-08-25
  • 2011-02-11
  • 1970-01-01
  • 2021-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多