当前位置: 首页 > article >正文

预处理详解

文章目录

    • 1.预定义符号
    • 2.#define定义常量
    • 3.#define定义宏
    • 4.宏和函数的区别

1.预定义符号

预定义符号用于预处理期间,便于预处理的进行。
预定义符号是由编译器预先设置好的特殊标识符,用于表示特定的信息,如编译器版本、目标平台信息、编译选项等。在C语言中,常见的预定义符号包括:
__LINE__:表示当前源码行号。
__FILE__:表示当前源文件名。
__DATE__:表示文件被编译的日期。
__TIME__:表示文件被编译的时间。
__FUNCTION__:表示进行编译的函数。
__STDC__:如果编译器遵循ANSI C,其值为1,否则未定义。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	printf("%s\n", __FILE__);
	printf("%d\n", __LINE__);
	printf("%s\n", __DATE__);
	printf("%s\n", __TIME__);
	printf("%s\n", __FUNCTION__);

	return 0;
}

在这里插入图片描述
在这里插入图片描述

2.#define定义常量

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define a 100
#define student  "lishi"
#define DEBUG_PRINT printf("file:%s\tline:%d\t \
 date:%s\ttime:%s\n" ,\
 __FILE__,__LINE__ , \
 __DATE__,__TIME__ ) 
int main()
{
	char arr[] = student;
	int b = a;
	printf("%d\n", b);
	printf("%s\n", arr);
	DEBUG_PRINT;
	return 0;
}

每⾏的后⾯都加⼀个反斜杠(续⾏符)。

3.#define定义宏

#define MUL(x) x*x
#define ADD(y) y+y
int main()
{
	int n = 5;
	printf("%d\n", MUL(n));
	printf("%d\n", MUL(n + 1));//5+1*5+1
	printf("%d\n", ADD(n));
	printf("%d\n", 10 * ADD(n));//10*5+5
	return 0;
}

在这里插入图片描述
在使用中注意()
所以⽤于对数值表达式进⾏求值的宏定义都应该⽤这种⽅式加上括号,避免在使⽤宏时由于参数中的操作符或邻近操作符之间不可预料的相互作⽤。

#define MUL(x) (x*x)
#define ADD(y) ((y)+(y))
int main()
{
	int n = 5;
	printf("%d\n", MUL(n));
	printf("%d\n", MUL(n + 1));
	printf("%d\n", ADD(n));
	printf("%d\n", 10 * ADD(n));
	return 0;
}

在这里插入图片描述

4.宏和函数的区别

带副作用的宏参数

int max(int z, int d)
{
	return((z++) > (d++) ? (z++) : (d++));

}
#define MAX(x,y) ((a++)>(b++)?(a++):(b++))
int main()
{ 
	int a = 1;
	int b = 5;
	int z = 1;
	int d = 5;
	MAX(a, b);
	printf("%d\n", a);
	printf("%d\n", b);//(b++)会执行
	int x=max(z, d);
	printf("%d\n", x);
	return 0;
}

在这里插入图片描述
宏和函数的对比:

在这里插入图片描述


http://www.kler.cn/news/328203.html

相关文章:

  • 深入浅出MongoDB(三)
  • Linux gadget 模拟触控屏 支持多点触控
  • 【监控体系搭建三】Docker部署PrometeusGrafana
  • Linux网络命令:用于管理和查询系统名称解析器(DNS)的实用工具resolvectl详解
  • 【湖南步联科技身份证】 身份证读取与酒店收银系统源码整合———未来之窗行业应用跨平台架构
  • TypeScript 设计模式之【状态模式】
  • JavaScript Set基础与实战应用
  • 基于大数据的健身器材销售数据分析及可视化系统
  • Python:lambda 函数详解 以及使用
  • 如何在本地和远程删除 Git 分支
  • SQL,将多对多的关联记录按行输出
  • Qt Creator安卓环境配置【筑基篇】
  • 数据结构-4.1.特殊矩阵的压缩存储
  • 【STM32单片机_(HAL库)】4-3-2【定时器TIM】测量按键按下时间1——编程实现捕获功能
  • 在Unity编辑器中实现组件的复制与粘贴:完整指南
  • Vue3学习(六)Vue3 + ts几种写法
  • 深入工作流调度的内核
  • 等保测评:企业数字安全的坚实盾牌
  • [Docker学习笔记]利用Dockerfile创建镜像
  • 无人机之编队控制篇
  • 速盾:cdn是怎么加速视频的?
  • C++第3课——保留小数点、比较运算符、逻辑运算符、布尔类型以及if-else分支语句(含视频讲解)
  • JAVA连接HDFS操作
  • docker(1) --- win11环境配置
  • React Native使用高德地图
  • vscode 的terminal 输出打印行数限制设置
  • 深度学习之贝叶斯分类器
  • camunda + oracle 启动报错 解决方法
  • Nginx的命令行控制
  • NLP:BERT的介绍并使用该模型计算文本相似度