C语言笔记-4-预处理宏的使用
文章目录
前言
自学笔记,没有历史知识铺垫(省略百度部分),C语言预处理宏的使用,前文gcc中可以了解到,宏会在预处理时,被替换到了实际代码中,编译的代码已经没有宏相关的代码了
一、预处理
1.#include
包含文件
// 系统库规范,一般使用<>引入(从系统路径查找)
#include <stdio.h>
// 三方库规范,一般使用""引入,便于区分(优先从当前目录查找,找不到则从系统路径查找)
#include "product.h"
2.#define
宏
// 宏会在预处理时将内容替换到代码中,此时不会对内容进行语法检查
#define PRODUCT_ID 12
// 如此处,预处理时会将1+1替换到代码中,如果有乘除运算,则程序可能不会达到预期效果如:1+1*5导致实际结果为6
#define UNIT 1+1
// 宏体可以使用()包裹,减少替换到代码时可能产生的问题,如:(1+1)*5,结果为10
#define UNIT (1+1)
//宏函数
#define UNIT(x) (2*(x))
//结果为22,而非12,通过(),达到预期设计的效果
...printf("UNIT(x): %d\n",UNIT(1+10));
3.#ifdef #else #endif
宏条件语句
可用于不同环境调试/切换或防止重复引入时使用
一般被判断的宏可以在gcc 中使用-D来注入,如gcc -DTEST_ENV
这样就不需要代码二次开发即可调试
//判断宏是否存在
#ifdef TEST_ENV
printf("show debug content");
#endif
4.预定义宏__FUNCTION__
:函数名
// 打印当前方法名
prinf("this function name is : %s",__FUNCTION__);
5.预定义宏__LINE__
:行号
// 打印当前行号
prinf("this line is : %d",__LINE__);
6.预定义宏__FILE__
:文件名
// 打印当前文件名 xx.c
prinf("this file is : %s",__FILE__);
二、宏体中的#与##
// 一个# 表示将内容字符串化
#define USER_TAG(tag) #tag
// 两个## 表示连接标识.将前后连接起来,如变量,函数的动态引用
#define USER_GROUP(num) user_group_##num
int main(){
int user_group_1=10;
int user_group_2=20;
//输出结果为user group is 10
printf("user group is %d \n",USER_GROUP(1));
//输出结果为user group is 20
printf("user group is %d \n",USER_GROUP(2));
return 0;
}
三、头文件h中宏的使用
// 组合使用这三个宏,可以防止嵌套依赖时,重复装载(如果已经依赖该文件,则不会重复依赖)
#ifndef __LED__H
#define __LED__H
// 函数的声明
// 变量的声明
// 类型(结构体、枚举、联合)的声明
// 宏定义
// 文件的包含
#endif
总结
本章主要为C语言预处理宏的使用