当前位置: 首页 > 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 函数用于判断某个宏是否定义。

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

相关文章:

#if等命令的学习

预处理命令 #include&#xff08;文件包含命令&#xff09; #define&#xff08;宏定义命令&#xff09; #undef #if&#xff08;条件编译&#xff09; #ifdef #ifndef #elif #endif defined函数&#xff08;与if等结合使用&#xff09; 下面将解释上述各自的用法、使用…...

【有啥问啥】深入浅出马尔可夫链蒙特卡罗(Markov Chain Monte Carlo, MCMC)算法

深入浅出马尔可夫链蒙特卡罗&#xff08;Markov Chain Monte Carlo, MCMC&#xff09;算法 0. 引言 Markov Chain Monte Carlo&#xff08;MCMC&#xff09;是一类用于从复杂分布中采样的强大算法&#xff0c;特别是在难以直接计算分布的情况下。它广泛应用于统计学、机器学习…...

java企业办公自动化OA

技术架构&#xff1a; sshjbpm 功能描述&#xff1a; 用户管理&#xff0c;岗位管理&#xff0c;部门管理&#xff0c;权限管理&#xff0c;网上交流&#xff0c;贴吧&#xff0c;审批流转。权限管理是树状结构人性化操作&#xff0c;也可以用作论坛。 效果图&#xff1a;...

【leetcode】树形结构习题

二叉树的前序遍历 返回结果&#xff1a;[‘1’, ‘2’, ‘4’, ‘5’, ‘3’, ‘6’, ‘7’] 144.二叉树的前序遍历 - 迭代算法 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,…...

在ros2中安装gazebo遇到报错

安装命令&#xff1a; sudo apt-get install ros-${ROS_DISTRO}-ros-gz 报错如下&#xff1a; E: Unable to locate package ros-galactic-ros-gz 解决方法&#xff1a; 用如下安装命令&#xff1a; sudo apt install ros-galactic-ros-ign 问题解决&#xff01;...

VMware vSphere 8.0 Update 3b 发布下载,新增功能概览

VMware vSphere 8.0 Update 3b 发布下载&#xff0c;新增功能概览 vSphere 8.0U3 | ESXi 8.0U3 & vCenter Server 8.0U3 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-vsphere-8-u3/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页…...

在设计开发中,如何提高网站的用户体验?

在网站设计开发中&#xff0c;提高用户体验是至关重要的。良好的用户体验不仅能提升用户的满意度和忠诚度&#xff0c;还能增加转化率和用户留存率。以下是一些有效的方法和策略&#xff1a; 优化页面加载速度 减少HTTP请求&#xff1a;合并CSS和JavaScript文件以减少HTTP请求…...

油耳拿什么清理比较好?好用的无线可视挖耳勺推荐

油耳的朋友通常都是用棉签来掏耳。这种方式是很不安全的。因为使用棉签戳破耳道和棉絮掉落在耳道中而引起感染的新闻不在少数。在使用过程中更加建议大家可视挖耳勺来清理会更好。不仅清晰度得干净而且安全会更高。但最近这几年我发现可视挖耳勺市面上不合格产品很多&#xff0…...

永久配置清华源,告别下载龟速

为了每次使用 pip 时自动使用清华源&#xff0c;可以通过以下步骤进行配置&#xff1a; 方法一&#xff1a;通过命令行配置 你可以在命令行中运行以下命令来自动设置清华源&#xff1a; pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple此命令会将…...

什么是数据库回表,又该如何避免

目录 一. 回表的概念二. 回表的影响三. 解决方案1. 使用覆盖索引2. 合理选择索引列3. 避免选择不必要的列4. 分析和优化查询5. 定期更新统计信息6. 避免使用SELECT DISTINCT或GROUP BY7. 使用适当的数据库设计 数据库中的“回表”是指在查询操作中&#xff0c;当数据库需要访问…...

UE5中使用UTexture2D进行纹理绘制

在UE中有时需要在CPU阶段操作像素&#xff0c;生成纹理贴图等&#xff0c;此时可以通过UTexture2D来进行处理&#xff0c;例子如下&#xff1a; 1.CPP部分 首先创建一个蓝图函数库&#xff0c;将UTexture2D的绘制逻辑封装成单个函数&#xff1a; .h&#xff1a; #include &…...

Matlab simulink建模与仿真 第十六章(用户定义函数库)

参考视频&#xff1a;simulink1.1simulink简介_哔哩哔哩_bilibili 一、用户定义函数库中的模块概览 注&#xff1a;MATLAB版本不同&#xff0c;可能有些模块也会有差异&#xff0c;但大体上区别是不大的。 二、Fcn/Matlab Fcn模块 1、Fcn模块 双击Fcn模块&#xff0c;在对话…...

每天练打字2:今日状况——完成击键5第1遍,赛文速度74.71

今日跟打&#xff1a;604字 总跟打&#xff1a;99883字 记录天数&#xff1a;2435天 &#xff08;实际没有这么多天&#xff0c;这个是注册账号的天数&#xff09; 平均每天&#xff1a;41字 练习常用单字中500&#xff0c;击键5&#xff0c;键准100%&#xff0c;两遍。&#x…...

给新人的python笔记(一)

元组与列表 元组使用圆括号&#xff08;&#xff09;而不是[]列表的元素可以修改&#xff0c;但元组的元素不能修改 创建元组 menu1 (meat,fish,chicken) 访问元组 print(menu[1:3]) 修改元组 不支持 元组内置函数 len(tuple)&#xff1a;计算元组中元素个数&#xff1b…...

如何实现异步并发限制

如何实现异步并发限制 文章目录 如何实现异步并发限制方法1注意点 方法2题目要求实现方法注意点 之前一直没有系统的去总结异步并发限制的实现思路&#xff0c;今天就来做个总结吧 方法1 只有一个变量 pool&#xff1a;代表正在执行中的任务中的集合 function sleep(name, t…...

孙怡带你深度学习(2)--PyTorch框架认识

文章目录 PyTorch框架认识1. Tensor张量定义与特性创建方式 2. 下载数据集下载测试展现下载内容 3. 创建DataLoader&#xff08;数据加载器&#xff09;4. 选择处理器5. 神经网络模型构建模型 6. 训练数据训练集数据测试集数据 7. 提高模型学习率 总结 PyTorch框架认识 PyTorc…...

如何在Android上实现RTSP服务器

技术背景 在Android上实现RTSP服务器确实是一个不太常见的需求&#xff0c;因为Android平台主要是为客户端应用设计的。在一些内网场景下&#xff0c;我们更希望把安卓终端或开发板&#xff0c;作为一个IPC&#xff08;网络摄像机&#xff09;一样&#xff0c;对外提供个拉流的…...

代理导致的git错误

问题&#xff1a; 今天在clone时出现如下错误&#xff1a; fatal: unable to access https://github.com/NirDiamant/RAG_Techniques.git/: Failed to connect to 127.0.0.1 port 10089 after 2065 ms: Couldnt connect to server真是让人感到奇怪&#xff01;就在前天&#…...

Ready Go

本文首发在这里 温馨提示 XX年&#xff0c;指的是20XX年&#xff0c;后跟以前、以后之类&#xff0c;均包含本数链接较多&#xff0c;只是想言之有物&#xff0c;已拒绝相同外链&#xff0c;仅看关心的即可已尽量只引用自己的东西&#xff0c;16年后仓库(11/13)&#xff0c;2…...

Matlab simulink建模与仿真 第十三章(信号通路库)

参考视频&#xff1a;simulink1.1simulink简介_哔哩哔哩_bilibili 一、信号通路库中的模块概览 1、信号通路组 注&#xff1a;部分模块在第二章中有介绍&#xff0c;本章不再赘述。 2、信号存储和访问组 二、总线分配模块 Bus Assignment模块接受总线作为输入&#xff0c;并…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

comfyui 工作流中 图生视频 如何增加视频的长度到5秒

comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗&#xff1f; 在ComfyUI中实现图生视频并延长到5秒&#xff0c;需要结合多个扩展和技巧。以下是完整解决方案&#xff1a; 核心工作流配置&#xff08;24fps下5秒120帧&#xff09; #mermaid-svg-yP…...

CTF show 数学不及格

拿到题目先查一下壳&#xff0c;看一下信息 发现是一个ELF文件&#xff0c;64位的 ​ 用IDA Pro 64 打开这个文件 ​ 然后点击F5进行伪代码转换 可以看到有五个if判断&#xff0c;第一个argc ! 5这个判断并没有起太大作用&#xff0c;主要是下面四个if判断 ​ 根据题目…...