《C语言参考手册(原书第5版)》第3章C预处理器,C预处理器是一种简单的宏处理器。从概念上说,它在编译器读取源程序之前对C程序的源文本进行处理。在C的有些实现中,预处理器实际上是一个独立的程序。它读取最初的源文件,并写入到一个新的“经过预处理”的源文件,后者可以作为C编译器的输入。本节为大家介绍宏参数的副作用。
3.3.7 宏参数的副作用
宏也可能因为副作用而产生问题。由于宏的实际参数可能会被文本复制,它们的执行次数可能不止一次,因此实际参数的副作用可能会产生不止一次。反之,与宏调用看上去很相似的真正函数调用对实参表达式的求值次数正好只有一次,因此表达式的副作用也正好出现一次。为了避免这种问题,在使用宏时必须小心。
例子
考虑前一个例子的SQUARE宏以及(几乎)完成相同任务的square函数:
![]() |
![]() |
![]() |
![]() |
(12和5可能是b和a的最终值,这是因为标准C编译器可能以不同的方式对表达式((a++)*(a++)进行求值。参见第7.12节。)
参考:增值操作符++ 第7.4.4节。