C语言:预处理器
2023-02-18 16:40:15 时间
这是很基础的教程,我只是写给自己看,作为一个学习笔记记录一下,如果正在阅读的你觉得简单,请不要批评,可以关掉选择离开
如何学好一门编程语言
- 掌握基础知识,为将来进一步学习打下良好的基础。
- 上机实践,通过大量的例题学习怎么设计算法,培养解题思路。
- 养成良好的编码习惯,注释一定要写,要不然保你一周后自己写的代码都不认识了
预处理器
C 预处理器(C Preprocessor,CPP) 不是编译器的组成部分,预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理。
所有的预处理器命令都是以井号(#)开头。它必须是第一个非空字符,一般预处理器指令应从第一行开始。
下面列出了常用的预处理器指令:
指令 | 描述 |
---|---|
#define | 定义宏 |
#include | 包含一个源代码文件 |
#undef | 取消已定义的宏 |
#ifdef | 如果宏已经定义,则返回真 |
#ifndef | 如果宏没有定义,则返回真 |
#if | 如果给定条件为真,则编译下面代码 |
#else | #if 的替代方案 |
#elif | 如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码 |
#endif | 结束一个 #if……#else 条件编译块 |
#error | 当遇到标准错误时,输出错误消息 |
#pragma | 使用标准化方法,向编译器发布特殊的命令到编译器中 |
实例
#define MAX_ARRAY_LENGTH 20 // 把所有的 MAX_ARRAY_LENGTH 替换为 20 #undef FILE_SIZE // 取消已定义的 FILE_SIZE #include <stdio.h> // 从系统库中获取 stdio.h,并添加文本到当前的源文件中。 #include "myheader.h" // 从本地目录中获取 myheader.h,并添加内容到当前的源文件中。 // 只有当 MESSAGE 未定义时,才定义 MESSAGE 为 "You wish!"。 #ifndef MESSAGE #define MESSAGE "You wish!" #endif // 如果定义了 DEBUG,则执行处理语句 #ifdef DEBUG /* Your debugging statements here */ #endif
预定义宏
ANSI C 定义了许多宏。在编程中您可以使用这些宏,但是不能直接修改这些预定义的宏。
宏 | 描述 |
---|---|
__DATE__ | 当前日期,一个以 "MMM DD YYYY" 格式表示的字符常量。 |
__TIME__ | 当前时间,一个以 "HH:MM:SS" 格式表示的字符常量。 |
__FILE__ | 这会包含当前文件名,一个字符串常量。 |
__LINE__ | 这会包含当前行号,一个十进制常量。 |
__STDC__ | 当编译器以 ANSI 标准编译时,则定义为 1。 |
#include <stdio.h> int main(){ printf("File :%s\n", __FILE__); printf("Date :%s\n", __DATE__); printf("Time :%s\n", __TIME__); printf("Line :%d\n", __LINE__); return 0; }
预处理运算符
换行 \
#define message_for(a, b) \ printf(#a " and " #b ": We love you!\n")
使用宏参数 #
当需要把一个宏的参数转换为字符串常量时,则需要 #
#include <stdio.h> #define message_for(a, b) \ printf(#a " and " #b ": We love you!\n") int main(void){ message_for(Carole, Debra); return 0; }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Carole and Debra: We love you!
合并 ##
宏定义内的标记粘贴运算符(##)会合并两个参数。它允许在宏定义中两个独立的标记被合并为一个标记。例如:
#include <stdio.h> #define tokenpaster(n) \ printf ("token" #n " = %d", token##n) // token34 = 40 int main(void) { int token34 = 40; tokenpaster(34); return 0; }
defined() 判断是否定义
defined(标识符) 用来确定标识符是否使用 #define 定义过。如果标识符已定义,则值为真(非零)。否则 值为假(零)
#include <stdio.h> #if !defined (MESSAGE) #define MESSAGE "You wish!" #endif int main(void){ printf("Here is the message: %s\n", MESSAGE); return 0; }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Here is the message : You wish!
使用宏来模拟函数
例如,下面的代码是计算一个数的平方:
#define square(x) ((x) * (x)) // 等效与下面代码 int square(int x) { return x * x; }
在使用带有参数的宏之前,必须使用 #define 指令定义。参数列表是括在圆括号内,且必须紧跟在宏名称的后边。宏名称和左圆括号之间不允许有空格。例如:
#include <stdio.h> #define MAX(x,y) ((x) > (y) ? (x) : (y)) int main(void){ printf("20和10的最大值是:%d\n", MAX(10, 20)); // 20 return 0; }
参考
相关文章
- Java架构师大厂面试致命十连问,你接得住吗?
- 面试官:什么是Java优雅埋点API的设计思路?
- 第一次凡尔赛,字节跳动3面+腾讯6面一次过,谈谈我的大厂面经
- 苹果手机解不开怎么办?AnyMP4 iPhone Unlocker for Mac帮你轻松解决
- 【1】VScode 中文界面方法-------超简单教程
- 【4】 VScode最全面最实用的插件推荐,用了你就爱上了!
- 全网最详细超长python学习笔记、14章节知识点很全面十分详细,快速入门,只用看这一篇你就学会了!
- 面向对象五大设计原则
- 找工作、备考、面试刷题网站推荐(牛客网、力扣、计蒜客、hihocoder、七月在线)以及acm竞赛oj
- 【一】LaTeX的安装和使用、安装TeXstudio、中文界面输出设置
- 顶象为中国移动打造高效风控系统
- 规模商用不是终点:5.5G要完成两个“三级跳”
- 开放计算再造三原色:绿碳•红利•蓝海
- 英特尔小试「牛」刀,边缘计算引航智慧农场
- 总结一个问题:csdn发布文章页面为空或者创作内容管理为空
- 高考那些事儿,计算机类方向是否值得继续选择,我来给你解答。
- 太强了,全面解析缓存应用经典问题
- 关于图计算&图学习的基础知识概览:前置知识点学习(Paddle Graph L)
- Shell脚本监控网站页面正常打开情况
- Java开发桌面程序学习(一)——JavaFx+Jfoenix初始以及搭建