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

1、预处理

C语言预处理

预处理是C语言编译过程中的第一个阶段,它主要处理以 # 开头的预处理指令。预处理器会在实际编译之前对源代码进行一些文本操作。

1. 宏定义 (#define)

宏定义用于定义常量或者简单的函数。

1.1 简单的宏定义

// 定义圆周率常量
#define PI 3.14159
// 定义数组最大长度
#define MAX_SIZE 100int main() {// 使用PI宏计算圆的面积float area = PI * 5 * 5;// 使用MAX_SIZE宏定义数组int array[MAX_SIZE];return 0;
}

1.2 带参数的宏定义

// 定义一个宏来获取两个数中的最大值
#define MAX(a, b) ((a) > (b) ? (a) : (b))int main() {int x = 5, y = 7;// 使用MAX宏获取x和y中的最大值int max = MAX(x, y);return 0;
}

2. 条件编译

条件编译允许我们根据特定条件来决定是否编译某段代码。

// 定义DEBUG宏
#define DEBUGint main() {int x = 5;// 如果定义了DEBUG宏,则编译以下代码#ifdef DEBUGprintf("调试信息: x = %d\n", x);#endifreturn 0;
}

3. 文件包含

#include 指令用于在程序中包含其他文件的内容。

// 包含标准输入输出库
#include <stdio.h>
// 包含自定义头文件
#include "myheader.h"int main() {printf("你好,世界!\n");return 0;
}

4. 预定义宏

C语言预处理器提供了一些预定义的宏,可以用于获取编译相关的信息。

#include <stdio.h>int main() {// 输出当前文件名printf("当前文件: %s\n", __FILE__);// 输出当前行号printf("当前行: %d\n", __LINE__);// 输出编译日期printf("编译日期: %s\n", __DATE__);// 输出编译时间printf("编译时间: %s\n", __TIME__);return 0;
}

5. 宏运算符

5.1 字符串化运算符 (#)

字符串化运算符 # 用于将宏参数转换为字符串字面量。

#include <stdio.h>// 定义一个宏,将参数转换为字符串
#define STRINGIZE(x) #xint main() {// 使用STRINGIZE宏printf("%s\n", STRINGIZE(Hello));  // 输出: Helloprintf("%s\n", STRINGIZE(12345));  // 输出: 12345return 0;
}

在这个例子中,STRINGIZE(Hello) 会被转换为 "Hello"STRINGIZE(12345) 会被转换为 "12345"。这个宏可以将任何标识符或数字转换为字符串。

5.2 标记粘贴运算符 (##)

标记粘贴运算符 ## 用于连接两个标记,形成一个新的标记。

#include <stdio.h>// 定义一个宏,用于连接两个标记
#define CONCAT(a, b) a ## bint main() {// 定义变量int value1 = 10;int value2 = 20;// 使用CONCAT宏连接"value"和数字printf("value1 = %d\n", CONCAT(value, 1));  // 输出: value1 = 10printf("value2 = %d\n", CONCAT(value, 2));  // 输出: value2 = 20return 0;
}

在这个例子中,CONCAT(value, 1) 会被转换为 value1CONCAT(value, 2) 会被转换为 value2。这个宏可以动态地创建变量名或函数名。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Linux】进程(9):进程控制3(进程程序替换)
  • centos安装数据库同步工具sqoop并导入数据,导出数据,添加定时任务
  • java线程介绍
  • Sharding-JDBC分库分表之SpringBoot分片策略
  • 前端实现无缝自动滚动动画
  • 【leetcode刷题笔记】02.复写零
  • 华为HCIP Datacom H12-821 卷28
  • Postman使用教程【项目实战】
  • Java 8革新:现代编程的全新标准与挑战
  • 《梦醒蝶飞:释放Excel函数与公式的力量》10.4 IMREAL函数
  • C#字符串格式化的方式
  • nginx的正向代理和反向代理
  • 微软 Edge 浏览器全解析
  • Kylin系列(三)安装与配置:搭建你的第一个 Kylin 环境
  • 网络防御保护——网络安全概述
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • Consul Config 使用Git做版本控制的实现
  • Cookie 在前端中的实践
  • javascript从右向左截取指定位数字符的3种方法
  • Laravel核心解读--Facades
  • PHP变量
  • socket.io+express实现聊天室的思考(三)
  • Xmanager 远程桌面 CentOS 7
  • 和 || 运算
  • 马上搞懂 GeoJSON
  • 排序算法学习笔记
  • 七牛云假注销小指南
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 我这样减少了26.5M Java内存!
  • 在Docker Swarm上部署Apache Storm:第1部分
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • k8s使用glusterfs实现动态持久化存储
  • ​Benvista PhotoZoom Pro 9.0.4新功能介绍
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • ###C语言程序设计-----C语言学习(3)#
  • #APPINVENTOR学习记录
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (k8s中)docker netty OOM问题记录
  • (二)linux使用docker容器运行mysql
  • (附源码)springboot教学评价 毕业设计 641310
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (学习日记)2024.02.29:UCOSIII第二节
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • ./configure,make,make install的作用(转)
  • .bat文件调用java类的main方法
  • .cfg\.dat\.mak(持续补充)
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .net core Redis 使用有序集合实现延迟队列
  • .NET Core WebAPI中封装Swagger配置
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .net MySql
  • .net wcf memory gates checking failed
  • .Net 高效开发之不可错过的实用工具
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法