前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【C语言笔记】#define与typedef的区别?

【C语言笔记】#define与typedef的区别?

作者头像
正念君
发布2019-06-26 17:16:01
4.5K0
发布2019-06-26 17:16:01
举报
文章被收录于专栏:嵌入式大杂烩嵌入式大杂烩

#define

define是预处理指令,在编译时不进行任何检查,只进行简单的替换

宏定义的一般形式为:

代码语言:javascript
复制
#define 宏名 字符串

这里所说的字符串是一般意义上的字符序列,不要和C语言中的字符串等同,它不需要双引号。

typedef

typedef是在C语言中用来为复杂的声明定义简单的别名,它本身是一种存储类的关键字,与auto、extern、mutable、static、register等关键字不能出现在同一个表达式中。

typedef取别名的一般形式为:

代码语言:javascript
复制
typedef  旧名字  新名字

define与typedef的区别

(1)#define之后不带分号,typedef之后带分号。

(2)#define可以使用其他类型说明符对宏类型名进行扩展,而 typedef 不能这样做。如:

代码语言:javascript
复制
#define INT1 int
unsigned INT1 n;  //没问题
typedef int INT2;
unsigned INT2 n;  //有问题

INT1可以使用类型说明符unsigned进行扩展,而INT2不能使用unsigned进行扩展。

(3)在连续定义几个变量的时候,typedef 能够保证定义的所有变量均为同一类型,而 #define 则无法保证。如:

代码语言:javascript
复制
#define PINT1 int*;
P_INT1 p1,p2;  //即int *p1,p2;
typedet int* PINT2;
P_INT2 p1,p2;  //p1、p2 类型相同

PINT1定义的p1与p2类型不同,即p1为指向整形的指针变量,p2为整形变量;PINT2定义的p1与p2类型相同,即都是指向 int 类型的指针。

下面看一个关于typedef的重要的问题!!请看代码:

代码语言:javascript
复制
#include <stdio.h>

typedef char *pStr;

int main(void)
{
    char string[4]="abc";      //第一行代码
    const char *p1=string;  //第二行代码
    const pStr p2 = string; //第三行代码
    p1++;                      //第四行代码
    p2++;                    //第五行代码 

    return 0;
}

这段代码编译会报一个错误:error: increment of read-only variable 'p2',你知道问题出在哪吗?

答案与解析:

是第五行代码p2++出错了。这个问题提醒我们:typedef和#define不同,它不是简单的文本替换。上述代码中const pStr p2并不等于const char * p2。const pStr p2和pStr const p2本质上没有区别,都是对变量进行只读限制,只不过此处变量p2的数据类型是我们自己定义的而不是系统固有类型而已。

因此,const pStr p2的含义是:限定数据类型为char 的变量p2为只读,即为char const p2,表明p2是一个指向char类型的常指针,所以p2是不可修改的,因此p2++错误。

顺便提一下关于const声明的一些例子及其含义:

代码语言:javascript
复制
const int a;     //①
int const b;     //②
const int *c;    //③ 
int * const d;   //④  
int const * e const;  //⑤ 

①a是常数,不可改变;

②b是常数,不可改变;

③c是一个指向整型常数的指针,指针可以变,指针指向的内容不可以变;

④d是一个指向整型变量的常指针,指针不可以变,指针指向的内容可以变;

⑤e是一个指向整型常数的常指针,指针与指针指向的内容都不可变。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-10-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • #define
  • typedef
  • define与typedef的区别
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档