C语言学习笔记(11)
1. 条件编译
条件编译是指预处理根据测试的结果来包含或排除程序的片段。
2. #if和#endif
也不多说,举个例子就懂了。
#define DEBUG 1 int main (void) { #if DEBUG printf("Hello world"); #endif return 0; }
其实效果就是类似于这样的代码:
int main (void) { int debug=1; if(debug) printf("Hello world"); return 0; }
不同的是:预处理命令是由预处理器来处理。#if指令会测试DEBUG的值,如果DEBUG的值是0,那么这个printf就不会保存在目标程序中占用空间,也不会消耗程序的运行时时间。因此,我们在测试时可以将这段代码保存到最终代码中。
3. 一些相似的条件编译符号
defined运算符通常与#if联合使用,来判断某宏定义是否被定义。
#define DEBUG 1 int main (void) { #if defined DEBUG printf("Hello world"); #endif return 0; }
与其同样语义的还可以这样来写:
#define DEBUG 1 int main (void) { #ifdef DEBUG printf("Hello world"); #endif return 0; }
当然,还有#ifndef代表if not defined的语义。
#elif:else if
#else。
这些都是可以与#if配合使用的,和一般的条件判断语义一样。不再重复举例子。
4. 条件编译的用处
A. 调试。
B. 编写不同操作系统,不同平台,不同编译器使用的程序。
例如:
#define WINDOWS int main (void) { #if defined WINDOWS printf("WINDOWS"); #elif defined LINUX printf("LINUX"); #else printf("ELSE"); #endif return 0; }
C. 临时屏蔽代码
5. #error指令
遇到#error意味着遇到了比较严重的错误,编译器会立即终止程序,例如:
int main (void) { #if defined WINDOWS printf("WINDOWS"); #elif defined LINUX printf("LINUX"); #else #error Not Support #endif return 0; }6. 托管式实现和独立式实现
这是一个基础的概念。
大部分程序都是托管式实现,这些程序都需要底层的操作系统来提供输入输出以及其他的一些基本服务,而C的独立式实现用于不需要操作系统的程序。
一般来说,独立式程序用于编写操作系统内核以及嵌入式程序。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!