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

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


文章目录

  • C语言笔记-4-预处理宏的使用
  • 前言
  • 一、预处理
      • 1.`#include` 包含文件
      • 2.`#define` 宏
      • 3.`#ifdef #else #endif` 宏条件语句
      • 4.预定义宏`__FUNCTION__` :函数名
      • 5.预定义宏`__LINE__` :行号
      • 6.预定义宏`__FILE__` :文件名
  • 二、宏体中的#与##
  • 三、头文件h中宏的使用
  • 总结


前言

自学笔记,没有历史知识铺垫(省略百度部分),C语言预处理宏的使用,前文gcc中可以了解到,宏会在预处理时,被替换到了实际代码中,编译的代码已经没有宏相关的代码了


一、预处理

1.#include 包含文件

// 系统库规范,一般使用<>引入(从系统路径查找)
#include 
// 三方库规范,一般使用""引入,便于区分(优先从当前目录查找,找不到则从系统路径查找)
#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语言预处理宏的使用

你可能感兴趣的:(C笔记,c语言,开发语言)