typedef与define
程序员文章站
2024-03-23 11:40:58
...
typedef与define这个两个关键字都是给变量取别名,初学c语言的时候我是分不清楚它们的区别的。只知道它们是取别名的,具体的细节不懂,语法也不太清楚,更不懂使用的时机。如今我学会了,就去网上bbll分享一通个人的见解。
他们的作用:
起别名,最大作用就是简化复杂声明和改一个易于记忆的名字
一般情况下的它们如下语法:
typedef语法 :
typedef unsigned char uchar;
定义了一个uchar代表unsigned char 这个类型。
define语法:
#define PI 3.14
定义了一个PI表示3.14
typedef的几种使用的用法:
typedef 定义的新类型与编译系统固有的类型使用起来没有差别。
一、给已定义的变量类型起个别名
typedef unsigned char uchar;
typedef signed short INT16;
typedef signed int INT32;//等等
二、定义指针类型
#include <stdio.h>
#include <string.h>
typedef int *pint; //定义pint 是 int*类型
int main()
{
pint pi;
int i = 10;
pi = &i;
printf("%d", pi); //输出 10
}
三、定义函数指针类型
#include <stdio.h>
#include <string.h>
typedef void(*PADD)(int a, int b);//定义了一个函数指针
void add(int a, int b)
{
int tmp = a + b;
printf("sum = %d", tmp);
}
int main()
{
PADD pADD = add;
pADD(10, 20);
return 0;
}
然后你会想,这不是更麻烦并且没啥用吗?
但当一个函数的参数是一个函数的时候(有点绕也就是回调函数)
没有typedef:
void RECALLBACK(char *pc, int i, void *add(int a, int b))
{
//....实现就不写了,很多遍历函数,都会有传函数指针让用户决定如何操作,线程函数也是如此
}
有typedef:
typedef void(*PADD)(int a, int b);//定义了一个函数指针
void add(int a, int b)
{
int tmp = a + b;
printf("sum = %d", tmp);
}
void RECALLBACK(char *pc, int i, PADD padd)
{
//PADD是类型名 padd是变量名
}
四、定义结构体类型
typedef struct Student
{
char* name;
int number;
}Student, *PStudent; //Student是结构体,PStudent是结构体指针
typedef与#define的区别
- #define 进行简单的进行字符串替换。 #define 宏定义可以使用 #ifdef、#ifndef 等来进行逻辑判断,还可以使用 #undef 来取消定义。
- typedef 是为一个类型起新名字。typedef 符合(C语言)范围规则,使用 typedef定义的变量类型,其作用范围限制在所定义的函数或者文件内(取决于此变量定义的位置),而宏定义则没有这种特性。 通常,使用 typedef 要比使用 #define 要好,特别是在有指针的场合里。
上一篇: typedef与define
下一篇: 1. hello TensorFlow