typedef与#define和const的用法区分

本文详细解析了C语言中的typedef和define关键字的功能与用法。介绍了typedef如何为已有的数据类型定义新的名称,简化复杂类型的声明。同时,阐述了define如何作为宏定义来创建常量,并展示了其在预编译阶段的工作方式。通过具体的代码示例对比了两者在定义指针时的不同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。
在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。

define为宏定义,它可以用来定义一个常量,常量的值为字符串或者数字,不可再更改。
define可以用作定义无参或者有参运算式,定义时运算式要加括号,否则会出错误。

define只是简单的文本替换
typedef是给一个类型重命名
当我们定义指针的时候,typedef要比define有优势

define工作在预编译时,进行简单的文本替换
define定义时,如果涉及到运算式,需要用括号括起
for example:
define f(x) ((x)*(x))

typedef工作在编译时,将数据类型重名命
typedef可以命名复杂的数据类型,我们常见的结构体类型,就常常和typedef结合起来使用
for example:

typedef struct tagMyStruct
{
int iNum;
long lLength; 
}MyStruct;

实际上执行两个操作,一个是定义了结构体tagMyStruct,注意这是一个临时的名字

struct tagMyStruct
{
int iNum;
long lLength;
};

而typedef为这个结构体起了一个新名字

typedef struct tagMyStruct MyStruct;

如果我们要定义指针

typedef char* pStr1;

#define pStr2 char* 

pStr1 s1,s2;

pStr2 s3,s4;

在这里,s1,s2,s3都被定义为char*,s4为char类型,正确的写法应该是

pStr2 s3,*s4;

还有一例:

typedef char *pStr;
char string[4]="abc";
const char *p1=string;
const pStr p2=string;
p1++;
p2++;

如果我们执行会报错

$ gcc typedef_pointer.c -o typedef_pointer
typedef_pointer.c: In function ‘main’:
typedef_pointer.c:11:5: error: increment of read-only variable ‘p2’
p2++;
^

这是因为p2是一个只读常量,它是不可变的。const用于限定一个变量为只读变量(和常量的概念不同),const char* p1限定了p1指针为只读,*p1不可改变,但是p1是可以变的,故p1++不报错。

const pStr p2并不等于const char * p2,和pStr const p2作用相同,它限定了p2是只读变量,只不过类型是我们自己定义的pStr,故p2++报错。
const type M,这句话表明M被限定为只读变量,不可当常量使用,这是ANSI C的标准,与C++标准有不同之处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值