C语言 typedef 和 define 区别 - C语言零基础入门教程
目录
零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门
一.typedef 简介
C
语言 typedef
是为现有的类型起一个别名,使用起来更加的方便,注意:它并没有产生新的类型;
1.typedef 简化复杂的类型声明
A.定义普通变量
typedef int REAL_TYPE;
REAL_TYPE a = 10; //等价 int a = 10;
printf("a=%d",a);
B.定义函数指针
//声明了一个返回 bool 类型并带有两个(int和double)形参的
typedef bool (*FuncPointer)(int, double);
函数的指针类型FuncPointer
FuncPointer pFunc; //声明了一个FuncPointer类型的函数指针对象pFunc
C.定义结构体
在 C
语言中,如果定义结构体的时候没有声明 typedef
,声明结构体变量时就必须用struct
来声明,否则会报错;示例如下:
//不使用typedef
struct _Person
{
string name;
int age;
float height;
};
struct _Person person; //C语言中必须添加struct,C++可以不添加struct
//使用typedef
typedef struct _Person
{
string name;
int age;
float height;
}Person;
Person person;//使用typedef定义变量更加简单
在 C++
中定义结构体时即便没有声明 typedef
,声明变量不添加 struct
也可以正常使用;
2.定义与平台无关的类型
用 typedef
来定义与平台无关的类型,例如:同一份代码需要在 Linux
/ Mac
/ windows
使用,而每个平台都有不同的差异,可以通过以下方式解决:
#ifdef __APPLE__ //MAC平台:REAL_TYPE表示 int 类型
typedef int REAL_TYPE;
#elif WIN32 //Windows平台:REAL_TYPE表示 int 类型
typedef double REAL_TYPE;
#else //Linux平台:REAL_TYPE表示 bool 类型
typedef bool REAL_TYPE;
#endif
重上面代码可以看出,在不同的平台定义 REAL_TYPE
变量时,对应的数据类型都不一样,重而可以达到根据平台的差异性自定义设置的问题!
二.define 简介
C
语言中,可以用 #define
定义一个标识符来表示一个常量/函数,用 #define
定义标识符的一般形式为:
/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言教程 - C语言 typedef 和 define 区别
//@Time:2021/06/27 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/
//定义常量
#define MAX_VALUE 100 //定义整型变量MAX_VALUE值为100
#define USER_NAME "huge" //定义字符串变量USER_NAME值为"huge"
#define PI 3.1415926 //定义浮点数变量PI值为3.1415926
//定义简单函数
#define MAX(a,b) (a>b)?a:b //取两个数最大值
#define MIN(a,b) (a<b)?a:b //取两个数最小值
//定义复杂多行的函数
#define MACRO(arg1, arg2) do { \
\
stmt1; \
stmt2; \
\
} while(0)
关键是要在每一个换行的时候加上一个 "\ "
凡是以#开头的均为预处理指令,预处理又叫预编译。预编译不是编译,而是编译前的处理。这个操作是在正式编译之前由系统自动完成的。
三.typedef 和 define 区别
1.执行时间不同
关键字 typedef
在编译阶段有效,由于是在编译阶段,因此 typedef
有类型检查的功能。
[#define](https://www.codersrc.com/archives/8894.html)
则是宏定义,发生在预处理阶段,也就是编译之前,它只进行简单而机械的字符串替换,而不进行任何检查。凡是以 # 开头的均为预处理指令,预处理又叫预编译。预编译不是编译,而是编译前的处理。这个操作是在正式编译之前由系统自动完成的。
2.功能有差异
typedef
用来定义类型的别名,定义与平台无关的数据类型,与struct
的结合使用等。#define
不只是可以为类型取别名,还可以定义常量、变量、编译开关等。
3.作用域不同
#define
没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用;
/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言教程 - C语言 typedef 和 define 区别
//@Time:2021/06/27 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/
void func1()
{
#define HW "HelloWorld";
}
void func2()
{
string str = HW;
cout << str << endl;
}
typedef
有自己的作用域;
/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言教程 - C语言 typedef 和 define 区别
//@Time:2021/06/27 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/
void func1()
{
typedef unsigned int UINT;
}
void func2()
{
UINT uValue = 5;//error C2065: 'UINT' : undeclared identifier
}
四.猜你喜欢
- C 语言 数组下标越界和内存溢出区别
- C 语言 指针声明和定义
- C 语言 指针 p++ / p–
- C 语言 p++/§++/_(p++)/_p++
- C 语言 使用指针遍历数组
- C 语言 指针和数组区别
- C 语言 指针数组和数组指针区别
- C 语言 空指针 NULL
- C 语言 void 指针
- C 语言 野指针
- C 语言 函数值传递和址传递
- C 语言 函数缺省参数
- C 语言 函数不定长参数
- C 语言 函数指针
- C 语言 指针函数
- C 语言 回调函数 callback
- C 语言 typedef
- C 语言 define 定义常量
- C 语言 define 防止头文件重复包含
- C 语言 define 定义函数
- C 语言 define 定义函数(多行书写)
- C 语言 typedef 和 define 区别
未经允许不得转载:猿说编程 » C 语言 typedef 和 define 区别
本文由博客 - 猿说编程 猿说编程 发布!