预处理指令中#if 和 #endif的用法

在 C 语言中,#if#endif预处理指令,用于条件编译。它们的核心作用是:根据预处理器能够识别的条件(通常是宏定义或常量表达式),决定某段代码是否参与编译。

在这里插入图片描述

基本功能

  1. #if
    用于开启一个条件编译块,其后必须是一个常量表达式(可以是宏定义或字面值)。
    如果表达式结果为非零值(逻辑“真”),则编译 #if#endif 之间的代码;否则直接忽略这段代码。

  2. #endif
    标记条件编译块的结束。


典型用途

  1. 根据宏定义选择性编译代码

    #define DEBUG 1#if DEBUGprintf("Debug信息: x = %d\n", x); // 只有 DEBUG 非零时,此代码才会被编译
    #endif
    
  2. 跨平台代码适配

    #if defined(_WIN32)// Windows 平台专用代码#include <windows.h>
    #elif defined(__linux__)// Linux 平台专用代码#include <unistd.h>
    #endif
    
  3. 功能开关控制

    #define USE_FEATURE_A 1#if USE_FEATURE_A// 启用功能 A 的代码
    #else// 替代功能的代码
    #endif
    

与其他指令的配合

  • #elif:类似 else if,用于多分支条件:

    #if OS == 1// ...
    #elif OS == 2// ...
    #endif
    
  • #else:提供备选代码:

    #if defined(OPTION)// ...
    #else// ...
    #endif
    
  • defined():检查宏是否已定义:

    #if defined(DEBUG) && (VERSION > 5)// 当 DEBUG 已定义且 VERSION > 5 时编译
    #endif
    

注意事项

  1. 条件必须是预处理器可计算的
    表达式中的宏需在之前定义,且只能包含整数常量、字符常量和 defined() 操作符。

  2. #ifdef/#ifndef 的区别

    • #ifdef MACRO 等价于 #if defined(MACRO)
    • #ifndef MACRO 等价于 #if !defined(MACRO)
  3. 代码被完全排除
    如果条件不满足,#if#endif 之间的代码不会进入编译阶段(如同被删除)。


示例

#include <stdio.h>#define VERSION 3int main() {#if VERSION >= 3printf("高级功能已启用\n"); // VERSION >=3 时编译此代码#elseprintf("基础功能\n");#endifreturn 0;
}

VERSION 定义为 3 或更高时,输出 高级功能已启用;否则输出 基础功能


通过 #if#endif,开发者可以灵活控制代码在不同场景下的编译行为,是 C 语言中管理代码兼容性、调试和功能开关的重要工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/73739.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据库】掌握MySQL事务与锁机制-数据一致性的关键

在数据库的世界里&#xff0c;数据就是一切。而确保数据的准确性和一致性&#xff0c;则是数据库系统的核心任务之一。想象一下&#xff0c;如果没有合适的机制&#xff0c;当多个用户同时试图修改同一条数据时&#xff0c;会发生什么&#xff1f; chaos&#xff08;混乱&#…

linux 基础网络配置文件

使用“ifconfig”命令查看网络接口地址 直接执行“iconfg”命令后可以看到ens33、10、virbr0这3个网络接口的信息&#xff0c;具体命令如下 ifconfig ##查看网络接口地址 ens33:第一块以太网卡的名称 lo:“回环”网络接口 virbr0:虚拟网桥的连接接口 查看指…

OpenCV特征提取与深度学习CNN特征提取差异

一、特征生成方式 ‌OpenCV传统方法‌ ‌手工设计特征‌&#xff1a;依赖人工设计的算法&#xff08;如SIFT、FAST、BRIEF&#xff09;提取图像中的角点、边缘等低层次特征&#xff0c;需手动调整参数以适应不同场景‌。‌数学驱动‌&#xff1a;基于梯度变化、几何变换等数学规…

五种方案实现双链路可靠数据传输

本文介绍五种双链路数据传输方案,目标是利用设备的多个传输通道,(如双有线网口,网口+wifi, 网口+5G等场景 , 网口+ 自组网, 自组网 + 5G等),将数据复制后分流、分路同时传输,以期提高数据传输可靠性,满足高可靠性传输的应用场景需求。部分方案给出了实际验证结果 。 …

【备赛】遇到的小问题-1

问题描述-1 想实现的功能是&#xff0c;通过ADC实时测量某引脚的电压及其占空比。 可以通过旋转电位器&#xff0c;更改其电压。 首先我定义了这几个变量 uint32_t adc_value;//HAL库函数里面得出的采样值(实时更新) uint32_t percentage6;//占空比&#xff0c;随着adc_val…

最大公约数

4.最大公约数 - 蓝桥云课 最大公约数 题目描述 给定两个正整数 A,B&#xff0c;求它们的最大公约数。 输入描述 第1行为一个整数 T&#xff0c;表示测试数据数量。 接下来的 T 行每行包含两个正整数 A,B。 1≤T≤105&#xff0c;1≤A,B≤109。 输出描述 输出共 T 行&…

TMHMM2.0-蛋白跨膜螺旋预测工具-centos-安装+配置+排错

参考&#xff1a; A. Krogh, B. Larsson, G. von Heijne, and E. L. L. Sonnhammer. Predicting transmembrane protein topology with a hidden Markov model: Application to complete genomes. Journal of Molecular Biology, 305(3):567-580, January 2001. centos&#x…

docker run 命令常用参数

docker run 命令 用于从镜像创建并启动一个新的容器。 基本语法&#xff1a; docker run [OPTIONS] IMAGE [COMMAND] [ARG...]常用选项分类说明 容器配置 --name 为容器指定名称&#xff08;默认随机生成&#xff09;。 示例&#xff1a; docker run --name my_container …

Zbrush插件安装

安装目录在: ...\Zbrush2022\ZStartup\ZPlugs64

pandas中excel自定义单元格颜色

writerpd.ExcelWriter(filepathf05教师固定学生占比1月{today}.xlsx,engineopenpyxl) df.to_excel(writer,sheet_name明细) piv1.to_excel(writer,sheet_name1月分布) wswriter.book.create_sheet(口径) ws.cell(1,1).value综合占比&#xff1a; ws.cell(1,2).value固定学生占比…

整体二分算法讲解及例题

算法思想 整体二分&#xff0c;带有二分二字那么就一定和二分脱不了干系。 整体二分算法常用来解决询问区间的第 k k k小值的问题&#xff0c;思路如下&#xff1a; 我们二分的对象是这道题目给定的值域&#xff0c;及最小值与最大值之间的区间&#xff0c;在题目给定的数组中…

python+flask实现360全景图和stl等多种格式模型浏览

1. 安装依赖 pip install flask 2. 创建Flask应用 创建一个基本的Flask应用&#xff0c;并设置路由来处理不同的文件类型。 from flask import Flask, render_template, send_from_directory app Flask(__name__) # 设置静态文件路径 app.static_folder static app.r…

XML转义符详解:如何在XML中正确处理特殊字符

在XML中&#xff0c;某些字符具有特殊含义&#xff0c;如果直接在文本中使用这些字符&#xff0c;可能会导致XML解析错误。为了避免这些问题&#xff0c;我们需要使用XML转义符或CDATA段来处理这些特殊字符。本文将详细介绍XML转义符的使用方法、注意事项&#xff0c;并结合实际…

IPC 进程间通信(一):管道(匿名管道进程池)

1. 初识进程间通信 1.1进程间通信的目的&#xff1a; 1、数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程 2、资源共享&#xff1a;多个进程之间共享同样的资源 3、通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息&#xff0c;通知它&#xff08;它…

Linux-数据结构-单链表练习-双链表

一.单链表练习和一些功能实现 【1】单链表实现字典查询 &#xff08;1&#xff09;定义存放数据的结构体&#xff0c;在每次向里面存放数据时候需要清空 &#xff08;2&#xff09;对字典进行切割 空格切割字母&#xff0c;再从剩余里切割到解释&#xff0c;这里windows的txt文…

网络爬虫相关

一、爬虫的基础内容 1、基本概念和用途 1.1、概念&#xff1a; 模拟浏览器、发送请求&#xff0c;获取响应。&#xff08;只能获取客户端所展示出来的数据&#xff09; 1.2、特点&#xff1a;知识碎片化&#xff0c;针对不同的网站对应的方法也不同。 爬虫&#xff1a;模拟…

Lora 中 怎么 实现 矩阵压缩

Lora 中 怎么 实现 矩阵压缩 1. 导入必要的库 import torch import re from datasets import Dataset from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments, Trainer, \get_cosine_schedule_with_warmup, EarlyStoppingCallback from peft

golang-嵌套结构体

结构体嵌套 golang中没有类&#xff0c;他通过结构体来实现其他编程语言中类的相关功能。 具名结构体 基本语法 基本语法 golang的结构体嵌套特别简单。 type 结构体类型1 struct{字段 类型1字段 类型2 }//这样就实现了结构体的嵌套 type 结构体类型2 struct{字段 类型1字…

基于Spring Boot的大学校园生活信息平台的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

【 利用socket来实现简单远控】

利用socket来实现简单远控 &#x1f539; 免责声明⚠️ 重要提示一、什么是socket&#xff1f;二、如何使用socket来实现两台计算机之间的通信&#xff1f;服务端1、首先需要创建一个socket&#xff1b;2、绑定IP以及端口3、开启监听4、接受客户端连接5、客户端连接上之后就是命…