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

C语言预处理学习笔记

1. 预处理器的功能

预处理器(Preprocessor)在编译C语言程序之前对源代码进行预处理。预处理指令以#号开头,主要包括文件包含、宏定义、条件编译等功能。

2. 文件包含

文件包含功能用于在一个文件中包含另一个文件的内容,通常用于包含头文件。

2.1 #include 指令

#include指令用于包含头文件。头文件可以是标准库头文件或用户自定义头文件。

标准库头文件

标准库头文件使用尖括号<>括起来。

#include <stdio.h>
#include <stdlib.h>
用户自定义头文件

用户自定义头文件使用双引号""括起来。

#include "myheader.h"

3. 宏定义

宏定义用于定义宏常量和宏函数,便于代码的重用和管理。

3.1 定义宏常量

#define指令用于定义宏常量。

#define PI 3.14
#define MAX_SIZE 100

3.2 定义宏函数

宏函数是一种简单的文本替换,不进行参数类型检查和计算。

#define SQUARE(x) ((x) * (x))
#define MAX(a, b) ((a) > (b) ? (a) : (b))

3.3 取消宏定义

#undef指令用于取消宏定义。

#undef PI

4. 条件编译

条件编译用于根据条件选择性地编译代码,便于跨平台开发和调试。

4.1 #if#endif 指令

#if 指令用于在条件为真时编译代码块。

#define DEBUG 1#if DEBUGprintf("Debug mode\n");
#endif

4.2 #ifdef#endif 指令

#ifdef 指令用于在宏已定义时编译代码块。

#define FEATURE_ENABLED#ifdef FEATURE_ENABLEDprintf("Feature is enabled\n");
#endif

4.3 #ifndef#endif 指令

#ifndef 指令用于在宏未定义时编译代码块。

#ifndef MAX_SIZE#define MAX_SIZE 100
#endif

4.4 #else#elif 指令

#else#elif 指令用于在条件为假时编译代码块。

#define VALUE 10#if VALUE < 5printf("Value is less than 5\n");
#elif VALUE < 15printf("Value is less than 15\n");
#elseprintf("Value is 15 or greater\n");
#endif

5. 常用的预定义宏

预定义宏是编译器预定义的宏,可以在程序中使用。

5.1 __FILE__

__FILE__宏表示当前源文件的名称。

printf("Current file: %s\n", __FILE__);

5.2 __LINE__

__LINE__宏表示当前源文件的行号。

printf("Current line: %d\n", __LINE__);

5.3 __DATE__

__DATE__宏表示当前编译日期。

printf("Compile date: %s\n", __DATE__);

5.4 __TIME__

__TIME__宏表示当前编译时间。

printf("Compile time: %s\n", __TIME__);

5.5 __FUNCTION__

__FUNCTION__宏表示当前函数的名称。

void myFunction() {printf("Current function: %s\n", __FUNCTION__);
}

6. 宏和函数的区别

  • 宏在预处理阶段进行文本替换,不进行参数类型检查和计算。
  • 函数在编译阶段进行实际调用,具有参数类型检查和计算。

6.1 宏示例

#define SQUARE(x) ((x) * (x))int main() {int a = 5;printf("Square of %d: %d\n", a, SQUARE(a));return 0;
}

6.2 函数示例

int square(int x) {return x * x;
}int main() {int a = 5;printf("Square of %d: %d\n", a, square(a));return 0;
}
http://www.lryc.cn/news/540053.html

相关文章:

  • LLM基础环境准备-云服务器
  • 网络协议相关知识有哪些?
  • 基于Llama 3.2-Vision的医学报告生成
  • 离线部署大模型:ollama+deepseek+open-webui
  • 如何看nginx.conf文件?
  • 3月营销日历:开启春日盛宴,绽放生活魅力
  • pdf预览在vue项目中的使用兼容ie浏览器
  • Unity面板介绍_Project工程面板(23.1.1)
  • 使用Termux将安卓手机变成随身AI服务器(page assist连接)
  • MacOS安装Emacs
  • OpenCV机器学习(10)训练数据的一个核心类cv::ml::TrainData
  • 3.1 actor基本框架(c#的Akka.Actor模式)
  • Git使用[同一电脑多个账户ssh-key的管理]
  • 使用Python结合`stable-baselines3`库(包含PPO和TD3算法)以及`gym`库来实现分层强化学习的示例代码
  • 【论文笔记】MambaGlue: Fast and Robust Local Feature Matching With Mamba
  • 基于 Stanford CoreNLP 的中文自然语言处理
  • python 量化交易入门到提升详细教程,python量化交易教程
  • 如何设置爬虫的访问频率?
  • 前端循环全解析:JS/ES/TS 循环写法与实战示例
  • 大气体育直播模板赛事扁平自适应模板源码
  • vue3学习1
  • java机器学习计算指标动态阈值
  • mac os设置jdk版本
  • Python正则表达式学习
  • ShenNiusModularity项目源码学习(10:ShenNius.FileManagement项目分析)
  • mysql查看binlog日志
  • Node.js高频面试题精选及参考答案
  • TaskBuilder创建客户信息列表页面
  • Linux Iptables示例一则
  • 新手小白如何挖掘cnvd通用漏洞之存储xss漏洞(利用xss钓鱼)