typedef 说明符

来自cppreference.com
< cpp‎ | language


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

目录

[编辑]解释

声明中使用 typedef 说明符,指定该声明为 typedef 声明 而非变量或函数声明。

typedef 通常在声明的起始处出现,尽管它也可以出现在类型说明符后或两个类型说明符之间。typedef 说明符不能与类型说明符以外的其他说明符组合。

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

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

typedef 说明符不能在函数形参声明中出现,也不能在函数定义中的声明说明符序列 中出现:

void f1(typedefint param);// 非良构typedefint f2(){}// 非良构

typedef 说明符不能在不含声明符的声明中出现:

typedefstruct X {};// 非良构

[编辑]以链接为目的的 typedef 名

如果 typedef 声明定义了一个无名枚举,那么该声明声明的首个作为该类类型或枚举类型的 typedef 名是该类型的以链接为目的的 typedef 名

例如在 typedefstruct{/* ... */} S; 中,S 是以链接为目的的 typedef 名。以此方式定义的类或枚举名拥有外部链接(除非它在无名命名空间中)。

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

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

(C++20 起)

[编辑]注解

类型别名通过不同的语法提供与 typedef 声明相同的功能,而且也可以用于模板名。

(C++11 起)

[编辑]关键词

typedef

[编辑]示例

// 简单 typedeftypedefunsignedlong ulong;   // 下面两个对象拥有同一类型unsignedlong l1; ulong l2;   // 更复杂的 typedeftypedefint int_t, *intp_t, (&fp)(int, ulong), arr_t[10];   // 下面两个对象拥有同一类型int a1[10]; arr_t a2;   // 当心:下面两个对象拥有不同类型const intp_t p1 =0;// int *const p1 = 0constint*p2;   // 避免必须写 "struct S" 的常见 C 手法typedefstruct{int a;int b;} S, *pS;   // 下面两个对象拥有相同类型 pS ps1; S* ps2;   // 错误:存储类说明符不能在 typedef 声明中出现// typedef static unsigned int uint;   // typedef 可以在声明说明符序列中的任何位置中使用longunsignedtypedefintlong ullong;// 写作 "typedef unsigned long long int ullong;" 更符合惯例   // std::add_const,与许多其他元函数相似,使用了成员 typedeftemplate<class T>struct add_const {typedefconst T type;};   typedefstruct Node {struct listNode* next;// 声明名为 listNode 的新的(不完整)结构体类型} listNode;// 错误:与先前声明的结构体名冲突   // C++20 错误: “带有链接目的的 typedef 名的结构体”有成员函数typedefstruct{void f(){}} C_Incompatible;

[编辑]缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
CWG 576 C++98 不能在函数定义中的任何地方使用 typedef 可以在函数体中使用
CWG 2071 C++98 typedef 可以在不含声明符的声明中出现 不能出现

[编辑]参阅

typedef 声明 的 C 文档
close