当前位置: 首页 > 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;并…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中&#xff0c;如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议&#xff08;2PC&#xff09;通过准备阶段与提交阶段的协调机制&#xff0c;以同步决策模式确保事务原子性。其改进版本三阶段提交协议&#xff08;3PC&#xf…...

CSS 工具对比:UnoCSS vs Tailwind CSS,谁是你的菜?

在现代前端开发中&#xff0c;Utility-First (功能优先) CSS 框架已经成为主流。其中&#xff0c;Tailwind CSS 无疑是市场的领导者和标杆。然而&#xff0c;一个名为 UnoCSS 的新星正以其惊人的性能和极致的灵活性迅速崛起。 这篇文章将深入探讨这两款工具的核心理念、技术差…...