欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-11 19:02:05
...

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