define 和 typedef 两者的联系和区别

define用来定义一些常量和宏函数,然后在预处理阶段,编译器会直接替换

typedef用于定义一些新的类型,看起来更加直观或写起来更加方便

比如在单片机中,我们经常使用unsigned char

但是经常写又太麻烦,就会使用:

(1)typedef unsigned char uchar;

  (2)   #define uchar unsigned char(这个末尾不用加分号)

代码示例:

#include 

//#define uchar unsigned char

typedef unsigned char uchar;

int main()
{
        uchar p;
        p = 10;
        printf("%d\n",p);

        return 0;
}

编译结果:p = 10;

以上这种情况两者没有很大区别

再来看一种情况,用它们来定义一种指针类型

首先用typedef定义一种指针类型,示例代码:

#include 

typedef char* pstr;

int main()
{
        pstr p1 = NULL;
        pstr p2 = NULL;

        return 0;
}

这种情况下p1和p2都是指针类型

接着用#define定义一种指针类型,示例代码:

​
#include 

#define pstr char*

int main()
{
        pstr p1 = NULL;
        pstr p2 = NULL;

        return 0;
}

​

预处理后你会发现p1是指针类型,p2还是char类型,原因是宏定义只做简单的替换

还有一种容易踩坑的,当你加上const关键字时,示例代码:

#include 

typedef char* pstr;

int main()
{
        const pstr p;//const修饰的是*p而不是p

        p++;//这种是错误的,编译会出错
        (*p)++;//这种是正确的

        return 0;
}

代码中的const是修饰的是指针p而不是指针p指向的内容

 

你可能感兴趣的:(单片机,嵌入式硬件,c语言)