【问题标题】:Why does C bother to provide type definitions? [duplicate]为什么 C 会费心提供类型定义? [复制]
【发布时间】:2017-07-11 04:16:49
【问题描述】:

我遇到了以下问题,我找不到任何具体解释:为什么 C 会费心提供类型定义?定义 BOOL 宏不是和使用 typedef 定义 Bool 类型一样好吗?

例如,#define 指令可用于创建可用作布尔类型的宏:

#define Bool int

还有另一种设置布尔类型的方法,使用称为类型定义的功能。

typedef int Bool;

为什么首选最后一种方法?有什么优势?

【问题讨论】:

  • C 中没有 BOOL 宏,也没有内置的 bool 类型。但是,应该使用布尔类型 _Bool 代替自制软件 typedefs 或宏。关于您的问题:这是首选且强烈建议不要这样做。
  • 请注意,C 的 _Bool 在许多功能属性上与 OP 的 typedef int Bool ; 的结果不同。 Bool 这里不是展示 OP 的 typedef#define 问题的好例子。
  • @chux:它们不同的简单示例:_Bool b = 5; printf(%d", b);。试试这个typedefed int
  • _Bool 可能是一个不好的例子,因为它是一个带有 typedef 无法实现的语义的内置函数。
  • @Rizzo C 有一个真正的 _Bool。它与任何其他整数类型的不同之处在于,存储在其中的任何非零值都存储为 1,而存储在其中的零则存储为零。你不能用 typedef 得到它(溢出和缩小截断会妨碍你)。这可能就是你的问题的挑剔者(否则,这是一个非常好的问题,IMO)。

标签: c typedef preprocessor


【解决方案1】:

类型定义和宏定义有两个重要的区别。

类型定义比宏定义更强大。特别是,数组和指针类型不能定义为宏。假设我们尝试使用宏来定义“指向整数的指针”类型:

  #define PTR_TO_INT int *

声明

  PTR_TO_INT p, q, r

会变成

  int * p, q, r

预处理后。不幸的是,只有 p 是一个指针; qr 是普通的整数变量。类型定义没有这个问题。

其次,typedef 名称受制于与变量相同的作用域规则;在函数体内定义的 typedef 名称在函数外部无法识别。另一方面,宏名称无论出现在哪里都会被预处理器替换。

【讨论】:

  • 对象指针永远不应该是typedefed。只有经过深思熟虑才能使用数组。
  • 这里的一个弱点是讨论了#define PTR_TO_INT int * 的问题,但没有显示使用typedef 的解决方案` - IOWs,一个单方面的论点。 typdef int * ptr_to_int; 不是一个成功的解决方案。
  • @chux "typdef int * ptr_to_int; 不是一个成功的解决方案。"它肯定胜过#define PTR_TO_INT int *。在这种情况下,我看不出typedef 有什么问题。 typedef 确实使复杂的定义和声明(例如将函数作为参数的结构中的函数指针)更容易理解。
  • @AndrewHenle #define PTR_TO_INT int *paper tiger 当然有些typdef#define PTR_TO_INT int * 好,但是这个答案仍然缺少一个具体的例子来说明在这种情况下如何使用typedef 和这有多好。
  • @chux,为什么这样的事情不被认为是好的做法,或“成功的解决方案”? typedef int* IntPtr ; IntPtr x, y, z;
【解决方案2】:

除了上面提到的原因,还有一件事,宏可以是未定义和重新定义的,但不能是typedef。所以,从一个角度来看,typedef确定

例如

#define MAX 5

//some use of MAX

#undef MAX
#define MAX 10

// some more use of MAX

完全有效,但尝试做类似的事情

typedef int into;

///something....

typedef char into;

无效,因为“类型”之前已经定义。

因此,typedef 为“类型”创建别名,在这方面被认为更加一致。

【讨论】:

  • “所以,从一个角度来看,typedef 更明确。” - 这是我今天听到的最好的事情 :) 如果可以的话,我会投票两次,只是为了那个原因。只是不要问我为什么这么喜欢它,因为我不知道
  • @StoryTeller Twice 不是一个好选择,去三次。 :P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 2015-02-02
  • 1970-01-01
  • 2016-08-30
  • 2016-02-14
  • 2011-07-14
  • 2016-06-09
相关资源
最近更新 更多