欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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 要好,特别是在有指针的场合里。
相关标签: c语言 typedef