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

预处理详解

文章目录

    • 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+1printf("%d\n", ADD(n));printf("%d\n", 10 * ADD(n));//10*5+5return 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.mrgr.cn/news/40889.html

相关文章:

  • OpenGL ES 之EGL(6)
  • 对于基础汇编的趣味认识
  • 【四】Spring Cloud OpenFeign原理分析
  • 【Linux】进程概念-2
  • 给Windows系统设置代理的操作方法
  • 人工智能发展历程
  • Qt界面优化——绘图API
  • 产品经理的学习
  • SparkSQL-性能调优
  • 【内网渗透】最保姆级的春秋云镜Flarum打靶笔记
  • 自动变速箱系统(A/T)详细解析
  • STM32新建工程-基于库函数
  • 卫生间装修之前,一定要检查开发商做的防水,小心有坑
  • python 实现rayleigh quotient瑞利商算法
  • MySQL 8.0 为 Java 开发者提供的强大新特性:深度解析与实战演示
  • 数据结构-4.1.特殊矩阵的压缩存储
  • 【论文精度——长尾问题】Long-Tailed Learning as Multi-Objective Optimization
  • python 实现conjugate gradient共轭梯度算法
  • 达梦数据库开启归档模式
  • 【牛客网刷题记录】【java】二叉树