-
-
typedef
- 创建一个别名,可在任何需要(可能复杂的)类型名称的地方使用。
说明
typedef
说明符在
声明
中使用时,指定该声明为
typedef 声明
而非变量或函数声明。
通常,
typedef
说明符出现在声明的起始位置,但也允许出现在
类型说明符
之后,或两个类型说明符之间。
typedef
说明符不能与除类型说明符之外的任何其他说明符组合使用。
typedef 声明可以在同一行声明一个或多个标识符(例如
int
和指向
int
的指针),可以声明数组和函数类型、指针和引用、类类型等。此声明中引入的每个标识符都会成为
typedef 名称
,该名称是当关键字
typedef
被移除时该标识符原本对应的对象或函数类型的同义词。
typedef 名称是现有类型的别名,并非新类型的声明。
typedef
不能用于改变现有类型名称(包括 typedef 名称)的含义。一旦声明,typedef 名称只能被重新声明为指向同一类型。typedef 名称仅在其可见的作用域内有效:不同的函数或类声明可以定义具有不同含义的同名类型。
typedef
说明符不得出现在函数参数的声明中,也不得出现在
函数定义
的
decl-specifier-seq
中:
void f1(typedef int param); // 不合法的语法
typedef int f2() {} // 不合法的语法
typedef
说明符不得出现在不包含声明符的声明中:
typedef struct X {}; // 格式错误
用于链接目的的 typedef 名称
如果 typedef 声明定义了一个未命名的
类
或
枚举
,则该声明所声明的类类型或枚举类型的首个 typedef 名称即为该类型的
用于链接目的的 typedef 名称
。
例如,在
typedef
struct
{
/* ... */
}
S
;
中,
S
是用于链接目的的 typedef 名称。以这种方式定义的类或枚举类型具有
外部链接
(除非它位于无名命名空间中)。
|
以这种方式定义的无名类应仅包含C语言兼容的构造。特别地,它不得:
且所有成员类也必须(递归地)满足这些要求。
|
(since C++20)
|
注释
|
类型别名
通过不同的语法提供与typedef声明相同的功能,并且同样适用于模板名称。
|
(since C++11)
|
关键词
typedef
示例
// 简单类型定义
typedef unsigned long ulong;
// 以下两个对象具有相同类型
unsigned long l1;
ulong l2;
// 更复杂的类型定义
typedef int int_t, *intp_t, (&fp)(int, ulong), arr_t[10];
// 以下两个对象具有相同类型
int a1[10];
arr_t a2;
// 注意:以下两个对象不具有相同类型
const intp_t p1 = 0; // int *const p1 = 0
const int *p2;
// 避免书写"struct S"的常见C语言惯用法
typedef struct { int a; int b; } S, *pS;
// 以下两个对象具有相同类型
pS ps1;
S* ps2;
// 错误:存储类说明符不能出现在typedef声明中
// typedef static unsigned int uint;
// typedef可以出现在声明说明符序列的任何位置
long unsigned typedef int long ullong;
// 更常规的写法是 "typedef unsigned long long int ullong;"
// std::add_const 与许多其他元函数一样,使用成员类型定义
template<class T>
struct add_const
{
typedef const T type;
};
typedef struct Node
{
struct listNode* next; // 声明一个名为listNode的新(不完整)结构体类型
} listNode; // 错误:与先前声明的结构体名称冲突
// C++20 错误:"具有链接的typedef名称的结构体"包含成员函数
typedef struct { void f() {} } C_Incompatible;
缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。
|
缺陷报告
|
适用范围
|
发布时的行为
|
正确行为
|
|
CWG 576
|
C++98
|
typedef
不允许出现在整个函数定义中
|
允许在函数体内使用
|
|
CWG 2071
|
C++98
|
typedef
可以出现在不包含声明符的声明中
|
现在已禁止
|
参见