1、#define <头文件名> //引用头文件
例如:#define _STDIO_H_ ==#include<stdio.h>
2、#define <宏名> < 数据(表达式)> //宏定义<宏名>为<数据(表达式)>,在预处理时替换
例如:#define PI 3.1415 //在编译时,编译器会将字符串中的‘PI’除外的所有‘PI’出现的地方全部替换为3.1415
#define H (a*b) //在编译时,编译器会将字符串中的‘H’除外的所有‘H’出现的地方全部替换为(a*b)
3、#define <宏名>(<参数名>) <表达式> //宏定义函数<宏名>加<参数>,编译时会替代成<表达式>
例如:#define max(a,b) ((a)>(b)?(a):(b)) //这是大家经常会遇到的一个求较大值的函数(暂且让我称它为函数吧)
/*(1)与一般函数相比:宏函数会在编译时直接替代,不用传参,没有内存空间,相对省资源;宏函数编译时编译器不会检查语法等错误,若出现错误,要人工检查;但是宏函数不限制处理的参数数据类型,int能用,float也能用,一般函数则只能适应定义时的参数类型,若要多重适应,还得用函数重载,编码先对纠结。
(2)与内联函数相比:内联函数也是在编译时直接带到调用处,也不用传参数;但是内联函数在编译时,编译器会检查其语法等错误;内联函数除了没有内存占用,没有调用传参外,其余与一般函数一样,在调用时也受定义的参数数据类型限制。
(3)与函数模板相比:都是能适应多中数据类型的处理,(我对函数模板还没学好,回头再写)*/
4、#undef <宏名> //解除<宏名>的宏定义,(若同一个宏名被多次定义,编译时会报错,需解除宏定义,再重新宏定义)
例如:#undef H //‘H’已经被宏定义过了,现在要解除'H'的宏定义
5、#if define <宏名>
XXXXXX
#endif //如果<宏名>已经被定义过了,则执行‘XXXXXX’语句,否则,直接跳到#endif后面继续执行
例如:#if define H //如果‘H’被宏定义过了(一般用于重新定义)
#udef H //解除‘H’的宏定义
#define H 345//将‘H’定义为‘345’
#endif
6、#elif <条件> //如果前面的条件不为真,则编译后面的代码
7、#if !define <宏名>
XXXXXX
#endif //如果<宏名>未被定义过了,则执行‘XXXXXX’语句,否则,直接跳到#endif后面继续执行
例如:#if define H //如果‘H’未被宏定义过(防止重定义)
#define H 345//将‘H’定义为‘345’
#endif
8、#ifndef <宏名> //与5基本相同
XXXXXX
#endif //如果<宏名>未被定义过了,则执行‘XXXXXX’语句,否则,直接跳到#endif后面继续执行
例如:#ifndef H //如果‘H’未被宏定义过(防止重定义)
#define H 345 //将‘H’定义为‘345’
#endif
9、#error <报错信息> //一般和条件判断结合使用,用于给定报错信息
例如:#ifndef __cplusplus //当编译器不是C++编译器时,报错
#error 亲,您当前使用的不是C++编译器噢!
#endif
#include <stdio.h>
int main()
{
printf("Hello,World!");
return 0;
}
</span>
宏定义
最新推荐文章于 2024-03-06 23:11:33 发布