C语言笔记-4-语法-预处理宏的使用

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语言预处理宏的使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值