读书笔记:容易出错的预处理器—宏

《C专家编程》P5中,说明的是空格对宏的影响。 如: 

#define a(y) a_expanded(y) 
a(x)

被扩展为: 

a_expanded(x)

而 

#define a  (y)  a_expanded(y) 
a(x)

则被扩展为: 

(y)  a_expanded(y)(x)

宏还存在下面的问题: 

#include <stdio.h>

#define MUL(x)  (x * x)

int main(int argc, char *argv[])
{
    int a = 3;
    
    printf("%d^2 = %d\n", a, MUL(a));

    printf("%d^2 = %d\n", a+1, MUL(a+1));

    return 0;
}

输出结果为:

3^2 = 9
4^2 = 7

MUL(a) 被扩展为: a*a 

而 MUL(a+1) 被扩展为: a + 1 * a + 1 

改正的方法是,将 

#define MUL(x) (x * x)

改为 

#define MUL(x) ((x) * (x))


1.对于宏这样的预处理器,只应该适量使用。 

2.宏最好只用于命名常量,并为一些适当的结构提供简洁的记法。 

3.宏名应该大写,这样很容易与函数调用区分开来。 


你可能感兴趣的:(读书笔记,《C专家编程》)