首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Typedef declaration

typedef声明提供了一种方式来声明的标识符作为一个类型别名,要使用的替换可能复杂的类型名称。

该关键字typedef在声明中用于存储类说明符的语法位置,但不影响存储或关联:

代码语言:javascript
复制
typedef int int_t; // declares int_t to be an alias for the type int
typedef char char_t, *char_p, (*fp)(void); // declares char_t to be an alias for char
                                           // char_p to be an alias for char*
                                           // fp to be an alias for char(*)(void)

说明

如果声明使用typedef存储类说明符,则其中的每个声明符都将标识符定义为指定类型的别名。由于声明中只允许使用一个存储类说明符,因此typedef声明不能为静态或外部。

typedef声明不会引入独特的类型,它只会为现有类型建立同义词,因此typedef名称与它们所属的类型兼容。Typedef名称与普通标识符(如枚举器,变量和函数)共享名称空间。

VLA的typedef只能出现在块范围内。每次控制流经过typedef声明时,都会评估数组的长度,而不是声明数组本身:void copyt(int n){typedef int Bn; // B是VLA,其大小为n,现在评估n + = 1; B a; // a的大小是从之前的+ n = 1 int bn; // a和b的大小不同(int i = 1; i <n; i ++)ai-1 = bi; }

(自C99以来)

注释

typedef名称可能是不完整的类型,可以像往常一样完成:

代码语言:javascript
复制
typedef int A[]; // A is int[]
A a = {1, 2}, b = {3,4,5}; // type of a is int[2], type of b is int[3]

通常使用typedef声明将名称从标记名称空间注入到普通名称空间中:

代码语言:javascript
复制
typedef struct tnode tnode; // tnode in ordinary name space
                            // is an alias to tnode in tag name space
struct tnode {
    int count;
    tnode *left, *right; // same as struct tnode *left, *right;
}; // now tnode is also a complete type
tnode s, *sp; // same as struct tnode s, *sp;

他们甚至可以避免使用标签名称空间:

代码语言:javascript
复制
typedef struct { double hi, lo; } range;
range z, *zp;

Typedef名称通常也用于简化复杂声明的语法:

代码语言:javascript
复制
// array of 5 pointers to functions returning pointers to arrays of 3 ints
int (*(*callbacks[5])(void))[3]
 
// same with typedefs
typedef int arr_t[3]; // arr_t is array of 3 int
typedef arr_t* (*fp)(void); // pointer to function returning arr_t*
fp callbacks[5];

库经常将依赖于系统或依赖于配置的类型显示为typedef名称,以向用户或其他库组件提供一致的接口:

代码语言:javascript
复制
#if defined(_LP64)
typedef int     wchar_t;
#else
typedef long    wchar_t;
#endif

参考

  • C11标准(ISO / IEC 9899:2011):
    • 6.7.8类型定义(p:137-138)
  • C99标准(ISO / IEC 9899:1999):
    • 6.7.7类型定义(p:123-124)
  • C89 / C90标准(ISO / IEC 9899:1990):
    • 3.5.6类型定义

关键词

typedef.

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com