C语言 typedef 和 define 区别 - C语言零基础入门教程

目录

  • [一.typedef 简介]
    • [1.typedef 简化复杂的类型声明]
      • [A.定义普通变量]
      • [B.定义函数指针]
      • [C.定义结构体]
    • [2.定义与平台无关的类型]
  • [二.define 简介]
  • [三.typedef 和 define 区别]
    • [1.执行时间不同]
    • [2.功能有差异]
    • [3.作用域不同]
  • [四.猜你喜欢]

零基础 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 定义标识符的一般形式为:

/******************************************************************************************/

//定义常量
#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 没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用;

/******************************************************************************************/

void func1()
{
    #define HW "HelloWorld";
}
void func2()
{
    string str = HW;
    cout << str << endl;
}

typedef有自己的作用域;

/******************************************************************************************/

void func1()
{
    typedef unsigned int UINT;
}
void func2()
{
    UINT uValue = 5;//error C2065: 'UINT' : undeclared identifier
}
  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙年行大运

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值