目录
1.以#开头的行,都称为编译器指令
2.预定义宏
3.`#define`宏定义
4.带参宏
1.介绍
2.带参宏和函数区别
3.带参宏实现foreach循环
5.宏定义中的特殊符号
1.`##`连接
2.`#`把参数转为字符串
3.`#@`把参数转为字符
6.条件编译(整型)
7.`#inlcude`头文件包含
8.`#program`计算机式操作系统特定的—>windows
1.以#开头的行,都称为编译器指令
#define
定义宏#if #else #elif #endif
条件编译#ifdef #ifndef
判断是否定义了某个宏#error
错误#program
设定状态或指定完成(编译器)#undef
取消宏定义
2.预定义宏
__LINE__
行号__FILE__
源文件名__DATE__
创建日期__TIME__
创建时间__FUNCTION__
当前正在被访问的函数名(大项目查错误)—–>__func__
3.#define宏定义
定义形式:#define 宏名(一般为大写) stuff(替换内容)
使用宏定义相当于替换
注意:不能加分号
定义表达式时有歧义:
#define ar 2*5+1
则3*ar==31
所以可以这样定义#define ar (2*5+1)来避免歧义
4.带参宏
1.介绍
#define 宏名(形参表) stuff
//例: #define _sqrt(number) number*number
4^2---->_sqrt(4)
//通过带参宏定义申请内存的快捷方式----->函数不能传类型
#define calloc(size,type) calloc(size,sizeof(type))
2.带参宏和函数区别
- 在带参宏定义中,不会为形式参数分配内存(替换),因此不必指明数据类型
- 当调用频繁时带参宏的优势就明显了,因为函数调用有开销且要指定数据类型
3.带参宏实现foreach循环
#define foreach(_variable,_array) \
for(int _i=0,_cnt=0;_i<sizeof(_array)/sizeof(_array[0]);_i++,_cnt=0) \
for(_variable=_array[_i];_cnt<1;_cnt++)
//把元素保存到_variable中,然后输出
5.宏定义中的特殊符号
1.##
连接
#define Teval(name) name##_tel
Teval(zk)----->zk_tel
2.#
把参数转为字符串
#define to_string(val) #val
to_string(123456);----->不能把变量转为字符串,局限性大
3.#@
把参数转为字符
#define to_char(val) #@val
to_cahr(abcd)---->最多保存4个----->输出d,小端存储
6.条件编译(整型)
#if #elif #else #endif(必须有)
#error
#ifdef 如果定义了则
#ifndef 没有定义则
7.#inlcude
头文件包含
- 系统库头文件使用尖括号包含
- 自定义头文件使用双引号包含
- 防止头文件重复包含
#ifndef
#endif
8.#program计算机式操作系统特定的—>windows
#program one—->防止头文件重复包含
指定该文件在编译源码时仅由编译器包含(打开)一次
#program message("")
不中断编译的情况下,发送一个字符串文字量到标准输出
#program warning(...)修改编译器的警告状态
default //将警告行为重置为默认值
disable //不发出指定的警告信息
erroe //将指定的信息视为错误
once //指定的警告只显示一次
suppress //抑制下一行的指定警告生成(只对下一行生效)
//警告状态
//1.保存 push,n(1<=n<=4)
//2.恢复 pop
版权声明:本文为CSDN博主「热爱编程的小K」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_72157449/article/details/128430676