C语言 typedef 和 define 区别

ChatGPT 3.5 国内中文镜像站免费使用啦

零基础 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)    
关键是要在每一个换行的时候加上一个 "\ "

凡是以#开头的均为预处理指令,预处理又叫预编译。预编译不是编译,而是编译前的处理。这个操作是在正式编译之前由系统自动完成的。


使用 define 定义一个多行的复杂函数,关键是要在每一个换行的时候加上一个 \


三.typedef和define区别


1.执行时间不同

关键字 typedef 在编译阶段有效,由于是在编译阶段,因此 typedef 有类型检查的功能。

#define 则是宏定义,发生在预处理阶段,也就是编译之前,它只进行简单而机械的字符串替换,而不进行任何检查。凡是以 # 开头的均为预处理指令,预处理又叫预编译。预编译不是编译,而是编译前的处理。这个操作是在正式编译之前由系统自动完成的。


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
}

四.猜你喜欢

  1. C语言 数组下标越界和内存溢出区别
  2. C语言 指针声明和定义
  3. C语言 指针 p++ / p–
  4. C语言 p++/(p)++/(p++)/p++
  5. C语言 使用指针遍历数组
  6. C语言 指针和数组区别
  7. C语言 指针数组和数组指针区别
  8. C语言 空指针 NULL
  9. C语言 void 指针
  10. C语言 野指针
  11. C语言 函数值传递和址传递
  12. C语言 函数缺省参数
  13. C语言 函数不定长参数
  14. C语言 函数指针
  15. C语言 指针函数
  16. C语言 回调函数 callback
  17. C语言 typedef
  18. C语言 define 定义常量
  19. C语言 define 防止头文件重复包含
  20. C语言 define定义函数
  21. C语言 define 定义函数(多行书写)
  22. C语言 typedef 和 define 区别

ChatGPT 3.5 国内中文镜像站免费使用啦
© 版权声明
THE END
喜欢就支持一下吧
点赞1 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容