C中是否需要typedef?

sch*_*hot 13 c typedef

Typedef对于可移植名称,标记名称(typedef struct foo Foo;)和保持复杂(函数)声明可读(typedef int (*cmpfunc)(const void *, const void *);)非常有用.

但是在C中是否存在真正需要typedef的情况?通过简单地写出派生类型,你无法做到这一点.

澄清一点:我的意思是语言用户,而不是实施者.整个stdint.h是第二类的一个很好的例子.

结论

感谢您的输入.我想我可以总结为:

  • C99库需要typedef来实现(u)intN_t各种类型.
  • 在C89上,你真的想自己使用typedef来创建类似的可移植类型.
  • 使用va_arg宏时可能需要typedef ,但我怀疑你在实践中会遇到这些衍生类型.

sch*_*hot 15

谢谢大家的回答.我自己看了一些,在C99中发现了这个,J.2未定义的行为:

在下列情况下,行为未定:[...]

  • va_arg宏的类型参数不是这样的,只需通过post fi xing *(7.15.1.1)就可以获得指向该类型对象的指针.

因此,当您想要传递/提取复杂的派生类型时va_arg,int (*)[]您需要typedef将此类型转换为可能的(更新/更正)的内容:

typedef int (*intarrptr)[4];
intarrptr x = va_arg(ap, intarrptr);
Run Code Online (Sandbox Code Playgroud)

由于很难找到并且实际有用的案例,因此人们可能得出结论认为它不是一个强有力的论据typedef.

  • @Oli:为了获得一个指向`'(*)[4]`的指针,在最后添加一个`*`是不够的 - 你必须将它插入到中间,就像`int(**)[4]`.但是,va_args宏不能改变传入参数的内部,它们最终只能在令牌上添加.这就是为什么这个限制到位的原因. (4认同)
  • 我认为这是第一个在用户代码中需要`typedef`的实际例子(而不是编译器头部的内部等).很好找:) (3认同)

jam*_*lin 14

根据typedef定义,A 是别名.因此,您始终可以使用实际类型替换别名.否则它不会是别名.

这并不意味着避免typedef会是一个好主意.

  • 您可以*在语义上*用实际类型替换typedef-name.但你不能总是以文本*替换它.因此,在严格依赖于*textual*替换的代码中(例如,像'va_arg`这样的宏),除了使用typedef-name之外别无选择. (3认同)

jay*_*lee 5

来自维基百科:

typedef是C和C++编程语言中的关键字.typedef的目的是为现有类型指定替代名称,通常是那些标准声明繁琐,可能令人困惑或可能因实现而异的那些.1

根据这一定义,没有它从来没有要求,你总是可以只写出来的扩展形式.但是,可能存在宏定义,其基于平台或其他选择要使用的typedef.因此,始终使用扩展形式可能不是非常便携.