C89:论预处理命令
一.宏替换/宏定义(#define)
1.作用
在编译预处理时,对于程序出现的宏名,都用宏定义去替换常量值(字符串或数字)或者表达式,这称为宏展开.
宏定义是由源程序的宏定义完成的,宏展开是由预处理程序自动完成.
宏定义不做语法检查,预处理实在编译之前的处理,而编译的工作之一就是语法检查
宏替换不占用程序运行时间
源文件每一行只能有一条预处理命令,多行可用反斜杠'/'
预处理指令可以放在程序的任意一行
2.宏定义的优点
(1)方便程序修改
一般用无参形式的宏定义来替换常量值(字符串或数字)或者表达式
(2)提高程序运行效率
一般用带参形式的宏定义来完成简单的函数运算
3.形式
1.无参形式
#define 标识符 常量值(字符串或数字)或者表达式
1 2 | //宏定义不是语句,不用加分号结尾 #define M (a+b) |
2.带参形式
#define 宏名(形参表) 常量值(字符串或数字)或者表达式
1 | #define MAX(a,b) ((a>b)?(a):(b)) |
二.条件编译
注意:这段话只对.c文件有用,如果是.cpp文件,必须加上extern才能解决相互包含头文件导致全局变量冲突的问题
1 2 3 4 5 6 7 | //通过条件编译来避免重复包含头文件 #ifndef __headerfileXXX__ #define __headfileXXX__ ... 文件内容 ... #endif |
三.extern "c"
使用extern "c"的作用是让C++能够调用C写的模块库文件
但是我们现在自己写的都是.cpp生成的C++源文件,只有很老的代码才是纯C写的,所以很少会用到,一般用于模块接口
四.#undef
1 2 3 4 5 6 7 | #define WIDTH 80 #define ADD( X, Y ) ((X) + (Y)) . . . #undef WIDTH #undef ADD |
五.#pragma once
由于编译器每次都需要打开头文件才能判定是否有重复定义,因此在编译大型项目时,#ifndef会使得编译时间相对较长,因此一些编译器逐渐开始支持#pragma once的方式
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)