C++中typedef用法说明

typedef声明提供了一种将标识符声明为类型别名的方法,用于替换复杂的类型名。


解释

在声明中使用typedef说明符时,会指定这个声明是typedef声明,而不是变量或函数声明。通常,typedef说明符出现在声明的开头,但允许它出现在类型说明符之后,或者出现在两个类型说明符之间。

typedef声明可以在同一行上声明一个或多个标识符(例如int和指向int的指针),它可以声明数组和函数类型、指针和引用、类类型等。此声明中引入的每个标识符都成为typedef名称,只是省略了typedef。

typedef说明符不能与除类型说明符之外的任何其他说明符组合。

typedef名称是现有类型的别名,不是新类型的声明。Typedef不能用于更改现有类型名称(包括Typedef名称)的含义。一旦声明,typedef名称只能重新声明为再次引用同一类型。Typedef名称仅在其可见的范围内有效:不同的函数或类声明可以定义具有不同含义的同名类型。


用于链接的typedef名称

形式上,如果typedef声明定义了一个未命名的类(class)或枚举(enum),那么声明这个声明的第一个typedef名称将被用来表示类类型或枚举类型,仅用于链接目的。例如,在typedef struct {/*....*/} S;中,S是用于链接的typedef名称。以这种方式定义的类或枚举类型具有外部链接(除非它位于未命名的命名空间中)。

以这种方式定义的未命名类应该只包含C兼容的构造。尤其是,它不能:

  • 声明非静态数据成员、成员枚举或成员类以外的任何成员
  • 具有任何基类或默认成员初始值设定项
  • 包含lambda表达式

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


注意

type alias使用不同的语法提供与typedef相同的功能,并且也适用于模板名称。


例子

// 最简单的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;
 
// C语言中通常使用的避免写“struct S”的方式
typedef struct {int a; int b;} S, *pS;
 
// 以下两个对象具有相同的类型
pS ps1;
S* ps2;
 
// 下面的语句会报错,因为存储类说明符(storage-class-specifier)static不能在typedef声明中出现
// typedef static unsigned int uint;
 
// typedef可以在声明语句的任何位置出现
long unsigned typedef int long ullong;
// 但是上述的语句我们通常的使用方法是"typedef unsigned long long int ullong;"
 
// std::add_const, like many other metafunctions, use member typedefs
template< class T>
struct add_const {
    typedef const T type;
};
 
typedef struct Node {
    struct listNode* next; // declares a new (incomplete) struct type named listNode
} listNode; // error: conflicts with the previously declared struct name

官方文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值