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

#if等命令的学习

预处理命令

#include(文件包含命令)

#define(宏定义命令)

#undef #if(条件编译)

#ifdef

#ifndef

#elif

#endif defined函数(与if等结合使用)

下面将解释上述各自的用法、使用场景以及不同之处

C语言中的预处理命令在程序编译前进行处理,它们主要用于控制编译过程和代码的条件性包含。以下是各个命令的解释及其使用场景:

1. #include(文件包含命令)

用法: #include <文件名>#include "文件名"

  • 功能: 将指定的文件包含到当前文件中,通常用于包含头文件(如标准库或自定义头文件)。
  • 使用场景:
    • #include <...> 用于包含标准库或编译器已知的头文件(搜索路径不包括当前目录)。
    • #include "..." 用于包含自定义文件,编译器首先在当前目录查找文件。

例子:

#include <stdio.h> // 包含标准输入输出库

#include "myheader.h" // 包含自定义头文件

2. #define(宏定义命令)

用法: #define 宏名 宏内容

  • 功能: 定义一个宏,可以是常量或简单的代码片段(如函数的替代)。
  • 使用场景:
    • 定义常量来替代硬编码的值,使代码更易读。
    • 定义简单的宏函数进行重复代码的替代。

例子:

#define PI 3.14159 // 定义常量PI 
#define MAX(a, b) ((a) > (b) ? (a) : (b)) // 宏函数,返回较大值 

3. #undef(取消宏定义)

用法: #undef 宏名

  • 功能: 取消一个已定义的宏。
  • 使用场景: 用于防止同名的宏在其他地方被定义,或在需要重新定义宏时。

例子:

#undef PI // 取消之前定义的PI宏 
#define PI 3.14 // 重新定义PI 

4. #if(条件编译)

用法: #if 表达式

  • 功能: 根据表达式的计算结果(非零为真,零为假)决定是否编译其中的代码块。
  • 使用场景: 用于根据编译环境、平台或编译选项的不同进行条件性代码编译。

例子:

#if VERSION >= 2 printf("版本2或更高\n"); 
#endif 

5. #ifdef(条件编译)

用法: #ifdef 宏名

  • 功能: 当宏名已被定义时,编译该代码块。
  • 使用场景: 用于判断一个宏是否已被定义,通常用于防止重复包含头文件或根据宏定义决定编译不同的代码。

例子:

#ifdef DEBUG printf("调试模式\n"); 
#endif 

6. #ifndef(条件编译)

用法: #ifndef 宏名

  • 功能: 当宏名未被定义时,编译该代码块。
  • 使用场景: 与 #ifdef 相反,用于当宏未定义时编译代码,常用于头文件的多重包含保护。

例子:

#ifndef MY_HEADER_H 
#define MY_HEADER_H // 头文件内容 
#endif 

7. #elif(条件编译)

用法: #elif 表达式

  • 功能: 类似于 else if,在多个条件中进行选择。
  • 使用场景: 用于多条件分支的编译选择,与 #if#else#endif 结合使用。

例子:

#if VERSION == 1 printf("版本1\n"); 
#elif VERSION == 2 printf("版本2\n"); 
#else printf("其他版本\n"); 
#endif 

8. #endif(结束条件编译)

用法: #endif

  • 功能: 结束 #if#ifdef#ifndef 的条件编译块。
  • 使用场景: 用于结束条件编译结构。

例子:

#if VERSION >= 2 printf("版本2或更高\n"); 
#endif // 结束条件编译 

9. defined 函数(与 #if 结合使用)

用法: defined(宏名)

  • 功能: 判断某个宏是否已定义,通常与 #if 结合使用。
  • 使用场景: 用于条件性编译时的宏定义检测。

例子:

#if defined(DEBUG) printf("调试模式已启用\n"); 
#endif 

总结:

  • #include 用于包含头文件;
  • #define#undef 用于定义和取消宏;
  • #if#ifdef#ifndef#elif#endif 用于条件编译;
  • defined 函数用于判断某个宏是否定义。

这些预处理命令为程序提供了灵活的编译控制,使得代码能够适应不同的环境和配置。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Unity踩坑】为什么有Rigidbody的物体运行时位置会变化
  • 【Linux】Image、zImage与uImage的区别
  • 【蜡笔小新专享】安装虚拟机、PHP、DVWA
  • 三只羊的麻烦,轮到抖音了…
  • OpenCore Legacy Patcher 2.0.0 发布,83 款不受支持的 Mac 机型将能运行最新的 macOS Sequoia
  • Android Studio Menu制作
  • GPIO子系统
  • leetcode49字母异位词分组
  • 一.Oracle每日运维操作
  • 清理C盘缓存,电脑缓存清理怎么一键删除,操作简单的教程
  • Html在线编辑器
  • Markdown formula 公式
  • 【C#生态园】完整解读C#音频处理库:功能、安装配置和使用场景一网打尽
  • 2024短剧系统开发,付费短剧小程序app源码教程,分销功能讲解搭建上线
  • Java项目实战II基于Java+Spring Boot+MySQL的作业管理系统设计与实现(源码+数据库+文档)
  • [ JavaScript ] 数据结构与算法 —— 链表
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • Intervention/image 图片处理扩展包的安装和使用
  • Java 23种设计模式 之单例模式 7种实现方式
  • JavaScript创建对象的四种方式
  • Java读取Properties文件的六种方法
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Laravel5.4 Queues队列学习
  • learning koa2.x
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Python学习之路16-使用API
  • Sublime text 3 3103 注册码
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • windows下如何用phpstorm同步测试服务器
  • 大整数乘法-表格法
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 动态魔术使用DBMS_SQL
  • 一些关于Rust在2019年的思考
  • 用Visual Studio开发以太坊智能合约
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • 组复制官方翻译九、Group Replication Technical Details
  • #1015 : KMP算法
  • #include<初见C语言之指针(5)>
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (二)springcloud实战之config配置中心
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (简单) HDU 2612 Find a way,BFS。
  • (四)Linux Shell编程——输入输出重定向
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (推荐)叮当——中文语音对话机器人
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET 常见的偏门问题