C语言基础——宏相关

C语言是函数式编程,在函数内部的变量称为局部变量,而所有在函数外部的变量都称为成员变量。成员变量作用于整个.c文件,然后C语言中使用 预编译宏定义常量(字符串,数字,甚至是类似函数(不能有返回值声明,参数列表中的形参不能有类型声明,且不能使用大括号括起来,如果有多个语句,语句与语句之间需要用分号;隔开)的表达式等,

其本质是语句的替换,并不进行运算等操作

例如:

#define MULTIPLE(x,y) x*y
#define MAX(a,b) a>b?a:b
注意声明的宏的名称和表达式之间有一个以上空格

,而且,你不想使用该宏的时候,可以使用语句undef 语句来消除宏的下文作用域,可以在函数体内使用

#undef MAX

注意在宏定义时和消除宏的作用域操作之中可以不能使用分号;结句。

宏后面语句使用表达式时应注意,看下面代码:

#include <stdio.h>
#define SQ(x) x*x
int main(){
    int a=9,sq;
    sq = SQ(a+1);
    printf("sq=%d\n", sq);
    return 0;
}
按照正常的思维看,结果应该是100,但实际结果是19,这是因为宏只是把语句替换了,并没有做运算操作
实际上sq=a+1*a+1,结果自然是19啦,那这个时候怎么解决呢,代码如下
#define SQ(x) (x)*(x)

这样就确保万无一失了吗?NO,NO,NO,请看下面代码

#include <stdio.h>
#define SQ(x) (x)*(x)
int main(){
    int a=9,sq;
    sq = 200/SQ(a+1);
    printf("sq=%d\n", sq);
    return 0;
}
以为会得到的结果为2,实际上结果是200,因为宏只是替换语句,并不做运算,所以真正的语句
sq=200/(a+1)*(a+1),想必大家都看出来了吧。最保险的做法是无论定义什么表达式都用括号括起来
#define SQ(x) ((x)*(x))

带参数的宏和函数很相似,但有本质上的区别:宏展开仅仅是字符串的替换,不会对表达式进行计算;宏在编译之前就被处理掉了,它没有机会参与编译,也不会占用内存。而函数是一段可以重复使用的代码,会被编译,也会给它分配内存,每次调用函数,就是执行这块内存中的代码。

使用宏的好处个人认为有:节约内存空间,自定义

猜你喜欢

转载自blog.csdn.net/u013812502/article/details/81178634