• typedef - 创建能在任何位置替代(可能复杂的)类型名的别名。

解释

当在声明的 声明说明符序列 中使用 typedef 说明符时,指定该声明为 typedef 声明,而非变量或函数声明。 typedef 常出现在声明的起始,尽管允许它出现在类型说明符后,或二个类型说明符之间。

typedef 声明可于同一行声明一或多个标识符(例如 int 和指向 int 的指针),它可声明数组和函数类型、指针和引用、类类型等。此声明中引入的每个标识符都成为 typedef 名,它是假如关键词 typedef 被移除时标识符本应成为的对象或函数的类型的同意词。

类型说明符之外,typedef 说明符不能与其他说明符组合。

typedef 名是既存类型的别名,而并非对新类型的声明。typedef 不能用于更改既存类型名(包含 typedef 名)的含义。一旦声明,则 typedef 名只可重声明为再次指代同一类型。typedef 名仅在它为可见的作用域有效:不同函数或类声明中可以定义具有不同含义的同名类型。


typedef 说明符不可出现于不含声明符的声明中。




  1. typedef struct X {}; // 非良构



(C++17 起)

链接目的的 typedef 名

正式而言,若 typedef 声明定义无名枚举,则只有该声明声明的首个作为该类类型或枚举类型的 typedef 名用于代表类类型或枚举类型。例如在 typedef struct { // } S; 中, S 是链接目的的 typedef 名。以此方式定义的类或枚举名拥有外部链接(除非它在无名命名空间中)。


以此方式定义的无名类应当仅含 C 兼容的构造。具体而言,它必须不


- 声明异于非静态数据成员、成员枚举或成员类的任何成员,
- 拥有任何基类默认成员初始化器,或
- 含有 lambda 表达式

而所有成员类必须也(递归地)满足这些要求。
(C++20 起)

关键词

typedef

注解

类型别名用不同语法提供与 typedef 相同的功能,而且亦可用于模板名。

示例

  1. // 简单 typedef
  2. typedef unsigned long ulong;
  3.  
  4. // 下列两个对象拥有同一类型
  5. unsigned long l1;
  6. ulong l2;
  7.  
  8. // 更复杂的 typedef
  9. typedef int int_t, *intp_t, (&fp)(int, ulong), arr_t[10];
  10.  
  11. // 下列两个对象拥有同一类型
  12. int a1[10];
  13. arr_t a2;
  14.  
  15. // 避免必须写 "struct C" 的常见 C 手法
  16. typedef struct {int a; int b;} S, *pS;
  17.  
  18. // 下列两个对象拥有相同类型
  19. pS ps1;
  20. S* ps2;
  21.  
  22. // 错误:存储类说明符不能出现于 typedef 声明中
  23. // typedef static unsigned int uint;
  24.  
  25. // typedef 可用在 声明说明符序列 中的任何位置
  26. long unsigned typedef int long ullong;
  27. // 写作 "typedef unsigned long long int ullong;" 更符合惯例
  28.  
  29. // std::add_const,与许多其他元函数相似,使用了成员 typedef
  30. template< class T>
  31. struct add_const {
  32. typedef const T type;
  33. };
  34.  
  35. typedef struct Node {
  36. struct listNode* next; // 声明名为 listNode 的新的(不完整)结构体类型
  37. } listNode; // 错误:与先前声明的结构体名冲突