12.typedef的使用与结构体定义
迪丽瓦拉
2024-05-29 20:11:37
0

欢迎访问个人网络日志🌹🌹知行空间🌹🌹


文章目录

    • 1.基础介绍
    • 2.typedef 的常用的几种情况
    • 3.使用typedef可能出现的问题
    • 参考资料

1.基础介绍

typedef是C/C++语言中保留的关键字,用来定义一种数据类型的别名。

typedef并没有创建新的类型,只是指定了一个类型的别名而已。

typedef定义的类型的作用域只在该语句的作用域之内, 也就是说如果typedef定义在一个函数体内,那么它的作用域就是这个函数。如果typedef定义在一个命名空间中,则其作用域只在当前命名空间中。

使用 typedef 关键字可以用来定义自己习惯的数据类型名称,来替代系统默认的基本类型名称、数组类型名称、指针类型名称与用户自定义的结构型名称、共用型名称、枚举型名称等。

2.typedef 的常用的几种情况

  • 给基本数据类型定义别名
// 1
typedef doule REAL;
// 2
typedef float REAL;

定义数据类型REAL,在不同平台上通用的代码,如需改动,只需要修改typedef语句即可。

  • 为复杂类型定义别名,简化代码
typedef int *(*pFun)(int, int); // 定义函数指针int *add(int x, int y)
{int *p = new int;*p = x + y;return p;
}pFun fp[1]; // 定义函数指针数组
fp[0] = add;
std::cout << "r " << *fp[0](1,2) << std::endl;
  • typedef 与struct/enum/union等自定义数据类型共同使用

C语言中,对标签标识符强制了自己单独的命名空间,如自定义结构体时

struct Point {int x;int y;
};// 使用
struct Point p;

因在C语言中,Point定义在了struct命名空间中,使用时必须写成struct Point p,比较麻烦, 因此通常使用typedef给其起别名。

typedef struct Point_ {int x;int y;Point_(int a, int b) : x(a), y(b) {};
} Point; 
// 使用
Point p;

在C++中已经不是必须的了struct定义的类型,可直接通过类型名使用。

3.使用typedef可能出现的问题

  • 1.歧义
typedef char* PCHAR;
int strcmp(const PCHAR,const PCHAR);

在这里,const PCHARconst char*不同,const PCHAR中指针是常量,const char*中,char是常量

// constant pointer to constant char
const char * const
// constant pointer to char
char * const
// pointer to constant char
const char *
  • 2.重复的存储类关键字

虽然 typedef 并不真正影响对象的存储特性,但在语法上它还是一个存储类的关键字,就像 auto、extern、static 和 register 等关键字一样。因此,像下面这种声明方式是不可行的:

typedef static int INT_STATIC;

上面,statictypedef关键字重复了。


欢迎访问个人网络日志🌹🌹知行空间🌹🌹


参考资料

  • 1.https://stackoverflow.com/questions/612328/difference-between-struct-and-typedef-struct-in-c
  • 2.https://www.tutorialspoint.com/difference-between-const-char-p-char-const-p-and-const-char-const-p-in-c#:~:text=char*%20const%20says%20that%20the,cannot%20point%20to%20another%20char.
  • 3.http://c.biancheng.net/view/298.html

相关内容