#define和typedef

一、简介

#define(宏定义)只是简单的字符串代换(原地替换),它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了。

typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间。

例如使用typedef  定义size_t类型:

typedef int size_t;//类型是一个数据模板,变量是一个实在的数据。类型是不占内存的,而变量是占内存的。

C语言的2种类型:内建类型(ADT)与用户自定义类型(UDT)

内建类型是编译器定义的原生类型(基础数据类型,如int、double之类的);用户自定义类型不是语言自带的是程序员自己定义的(譬如数组类型、结构体类型、函数类型·····)。

 


二、示例代码 

#define只是原地展开,这个实际使用过程中要特别注意,例如以下两个例子:

  • 例(1)
#define dpChar char *       //#define不是语句( 不以';'结尾)
typedef char * tpChar;		// typedef是语句( 以';'结尾)

dpChar p1,  p2;			// 展开:char *p1, p2; 相当于char *p1, char p2;
tpChar p3,  p4;			// 等价于:char *p3, char *p4;	
printf("sizeof(p1) = %d.\n", sizeof(p1));		// 4
printf("sizeof(p2) = %d.\n", sizeof(p2));		// 1
printf("sizeof(p3) = %d.\n", sizeof(p3));		// 4
printf("sizeof(p4) = %d.\n", sizeof(p4));		// 4
  • 例(2)
#define Add(a,b) a+b;

一般的单独使用是没有问题的,但是如果遇到如:c * Add(a,b) * d的时候就会出现问题,代数式的本意是a+b然后和c,d相乘,但是因为使用了define(它只是一个简单的替换),所以式子实际上变成了c*a + b*d 。

 

#define经常还和条件编译搭配使用,如以下几个例子:

  • 例(3)
#ifndef ABCD_H
#define ABCD_H

// ... some declaration codes
 
#endif // #ifndef ABCD_H

头文件经常这么写,目的是防止重复包含头文件的宏。

  • 例(4)
#ifdef ABC
// ... codes while definded ABC
#elif (CODE_VERSION > 2)
// ... codes while CODE_VERSION > 2
#else
// ... remained cases
#endif // #ifdef ABC 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值