你真的了解typedef 吗?

typedef的四个用法

用法1

typedef是定义一种类型的别名,不是简单的宏替换。举个栗子:假设要声明两个字符型的变量,第一反应会写出如下的声明。
char * p1,p2;实际上p1是字符型指针,而p2是字符型变量,并不是要声明的字符指针;
正确的格式是:char *p1,*p2;
那么在这种情况在我们就可以用typedef关键字来声明,避免上述错误,如下:
typedef char* pointer;
ponter p1,p2;
在需要大量使用指针时,用typedef的方式就比较省事,还能避免一些错误。

用法2

用在与struct结构体结合的地方,比如声明一个结构体如下:
struct abc
{
int m;
float n;
};
struct abc p1,p2;
当然,c++中可以把struct省去,直接写成abc p1,p2;
那么就可以用typedef关键字来换个方式进行声明:
typedef struct abc
{
int m;
float n;
}tag;
直接用tag来声明即可:tag p1,p2;

用法3

用typedef来定义不同平台之间的类型;
比如STM32自带的stddef.h文件具有size_t的不同定义

#if defined(__cplusplus) || !defined(__STRICT_ANSI__)
 /* unconditional in C++ and non-strict C for consistency of debug info */
  #if __sizeof_ptr == 8
    typedef unsigned long size_t;   /* see <stddef.h> */
  #else
    typedef unsigned int size_t;   /* see <stddef.h> */
  #endif
#elif !defined(__size_t)
  #define __size_t 1
  #if __sizeof_ptr == 8
    typedef unsigned long size_t;   /* see <stddef.h> */
  #else
    typedef unsigned int size_t;   /* see <stddef.h> */
  #endif
   /* the unsigned integral type of the result of the sizeof operator. */
#endif

也就是说在不同的平台上使用时,只改typedef定义语句,不改其他源代码,size_t对应的类型就变更为这个平台要使用的类型,比较方便。

用法4

为复杂的声明定义一个简单的别名,比如
int (*func)(void);这是一个函数指针的声明;
用typedef来声明:
typedef int (*K)(void);
之后该函数指针的声明就变的很简洁了:K func;
又比如另外一个栗子:
原声明:int * (* a[5])(int,char*);
用tepedef 关键字:typedef int * ( * pFun)(int,char*);
那么原声明的简洁版就是:pFun a[5];

typedef的陷阱

陷阱一:
typedef是定义了一种新的类型名,它不是简单的宏替换
比如:
typedef char *PT;
int func( const PT,const PT);
那么函数func的参数const PT等价于const char *?然后实际上却并不是,它等价于char *const ,也就是使用typedef是不能直接简单的进行字符串的替换。
const char * 和char *const 的区别如下:
const char * p;指针p指向的字符是常量
char * const p;指针p本身是常量,不能移动,p指向的字符可以变

陷阱2

typedef本身是一个存储类型的关键字,但它不影响对象的存储特性。它不可以和auto、extern、static、 register等同时用,语法上会报错,如:
typedef static int a;
编译出错,提示指定了一个以上的存储类。

typedef与#define的区别

如下:

typedef char * PT1;
#define PT2 char*;
PT1 p1,p2;
PT2 p3,p4; 

上述定义中,p1,p2, p3是char *型的指针,而p4不是指针,是char变量。上面PT2 p3,p4; 等价于char *p3,p4;又等价于char *p3;char p4。即#define可以直接进行字符串的替换,而typedef不可以。

猜你喜欢

转载自blog.csdn.net/u014470361/article/details/79758548