Namespaces
Variants

typedef specifier

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous
  • 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 可以出现在不包含声明符的声明中 现在已禁止

参见

C 文档 关于 Typedef 声明