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

入门-C编程基础部分:16、 预处理器

飞书文档https://x509p6c8to.feishu.cn/wiki/DzSJwsGiTiXkeCkyEYUcuXbKnbf

C 预处理是编译过程中一个单独的步骤,是一个文本替换工具而已。所有的预处理命令都是以井号(#)开头。

指令描述
#define定义宏
#ifdef如果宏已经定义,则返回真
#ifndef如果宏没有定义,则返回真
#endif结束一个 #if……#else 条件编译块

#define

#define MAX_ARRAY_LENGTH 20

这个指令告诉编译器把所有的 MAX_ARRAY_LENGTH 定义为 20。使用 #define 定义常量来增强可读性。

#include <stdio.h>
#define MESSAGE "You wish!"
#define MAX_ARRAY_LENGTH 20
int main(void)
{printf("Here is the message: %s\n", MESSAGE);printf("max array length : %d\n", MAX_ARRAY_LENGTH );  return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

Here is the message: You wish!
max array length : 20

#define更多用法

宏定义函数

C语言一个强大的功能是可以使用参数化的宏来模拟函数。例如,

int square(int x) {return x * x;
}
我们可以使用宏重写上面的代码,如下:
#define square(x) ((x) * (x))

在使用带有参数的宏之前,必须使用 #define 指令定义。参数列表是括在圆括号内,且必须紧跟在宏名称的后边。宏名称和左圆括号之间不允许有空格。例如:

#include <stdio.h>#define square(x) ((x) * (x))int main(void)
{printf("10*10=%d\n", square(10)); return 0;
}

宏延续运算符(\

一个宏通常写在一个单行上。但是如果宏太长,一个单行容纳不下,则使用宏延续运算符(\)。例如:

#define square(x) \((x) * (x))

标记粘贴运算符(##

宏定义内的标记粘贴运算符(##)会合并两个参数。它允许在宏定义中两个独立的标记被合并为一个标记。例如:

#include <stdio.h>#define tokenpaster(n) printf ("token = %d", token##n)int main(void)
{int token34 = 40;tokenpaster(34);return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

token = 40

#ifndef

#ifndef TEST#define MESSAGE "You wish!"
#endif

这个指令告诉编译器只有当 MESSAGE 未定义时,才定义 MESSAGE,常用于头文件,防止重复引用

C
test.h
int a = 10;
app1.c
#include "test.h"
app2.c
#include "test.h"

编译时会报multiple definition of `a'错误,这时候可以添加

#ifndef TEST
  
int a = 10;
#endif

#ifdef

#ifdef DEBUG
  
/* Your debugging statements here */
#endif

这个指令告诉 CPP 如果定义了 DEBUG,则执行处理语句,常用于编译选择,例如下发工程,如果我们只希望在调试时打印信息,正式发布不打印信息。

#include <stdio.h>#define DEBUG
#ifdef DEBUG#define MESSAGE "You wish!"
#endifint main(void)
{#ifdef DEBUGprintf("Here is the message: %s\n", MESSAGE);#endifreturn 0;
}

http://www.xdnf.cn/news/70975.html

相关文章:

  • 如何动态调整Python爬虫的Request请求延迟
  • Java写数据结构:栈
  • MySQL《事务》
  • ts中的类型
  • 【EasyPan】application.properties配置文件解析
  • 企业常见漏洞类型
  • 《浔川代码编辑器v2.0内测(完整)报告》
  • 创新项目实训开发日志3
  • 深度剖析d3dx9_42.dll错误:从原理到解决d3dx9_42.dll丢失方案
  • 总结设计测试用例的万能公式
  • 企业微信-自建应用
  • opencv 对图片的操作
  • c++学习之---vector
  • 华为认证HCIE考试费用总结
  • 平均精确度(Average Precision, AP)和均值平均精确度(Mean Average Precision, mAP)的区别和联系浅析
  • Spring MVC 一个简单的多文件上传
  • element-ui中的上传组件el-upload非自动上传监听不到success
  • 每天一道面试题@第一天
  • 12.QT-Combo Box|Spin Box|模拟点餐|从文件中加载选项|调整点餐份数(C++)
  • 【数据结构入门训练DAY-19】总结数据结构中的栈
  • 柔和的风光人像静物摄影Lr调色教程,手机滤镜PS+Lightroom预设下载!
  • LX2-编译及下载程序
  • shardingsphere启动报mode错误
  • 软考中级数据库系统工程师学习资料分享
  • 控制系统的结构和关键指标
  • 02_Flask是什么?
  • 【大模型】Browser-Use AI驱动的浏览器自动化工具
  • ORB-SLAM_地图点优化_固定位姿_g2o定义_雅可比矩阵推导
  • Vscode开发STM32标准库
  • 实践项目开发-hbmV4V20250407-项目架构设计