C和指针(pointers on C)第14章学习笔记《预处理器》

1.宏(macro)

#define机制包括一个规定,允许把参数替换到文中,这种通常称之为宏。

#define name(parameter-list) stuff
#define square(x) x*x

上述申明后,在程序中square(2)就相当于 22
但是这样定义的宏很容易出现问题
eg : square(a+1) 我们认为该表达式应该是 (a+1)
(a+1)
实际上为a+1*a+1结果改变了
因此在有参数的情况定义宏,最好加上括号 eg:

#define square(x) ((x)*(x))

2.宏与函数的差异

属性函数
执行速度更快存在函数调用/返回的额外开销
操作符,优先级宏参数求值是在周围表达式上下文环境中,除非加上括号否则容易出现临近操作符优先的情况函数参数只在调用时求值,更容易预测结果
参数求值每次使用宏定义时,他们都将重新求值多次使用并不会导致多种求值过程
参数类型宏与类型无关,都可以使用函数的参数与类型有关,只能使用定义时规定的类型

3.undef

#undef name 用于解除一个宏定义

4.条件编译

#if constant-expression
	statement
#end if

其中constant-expression部分有预处理器求值,如果为真那么statement部分正常编译 eg:

#if DEBUG
	printf("use it");
#end if
#define DEBUG 1

类似的

#if constant-expression
	statement
#else if constant-expression
	statement
#else .....

#end if

5.确认是否被定义

#if define(symbol)   or
#ifdef symbol
#if !define(symbol)
#ifndef(symbol)

在各种镶套的情况下每一个 if都要对应 endif
ifdef也要对应endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值