C++ #if

在 C++ 中,#if 是 预处理器指令(Preprocessor Directive),用于 条件编译,即在编译阶段根据条件决定是否包含某段代码。它通常与 #define#ifdef#ifndef#else 和 #endif 配合使用。


基本语法

#if 条件表达式// 如果条件为真,编译这部分代码
#else// 如果条件为假,编译这部分代码
#endif
  • 条件表达式 必须是 常量表达式(编译时可确定的值)。

  • 如果条件成立(非零),则编译 #if 和 #else/#endif 之间的代码;否则跳过。


常见用法

1. 检查宏是否定义

#define DEBUG 1  // 定义 DEBUG 宏#if DEBUGstd::cout << "Debug mode is ON\n";
#elsestd::cout << "Debug mode is OFF\n";
#endif
  • 如果 DEBUG 被定义且非零,则输出 "Debug mode is ON"


2. 与 #ifdef 和 #ifndef 结合

指令作用
#ifdef 宏如果宏已定义,则编译后续代码
#ifndef 宏如果宏未定义,则编译后续代码

示例:防止头文件重复包含

#ifndef MY_HEADER_H  // 如果 MY_HEADER_H 未定义
#define MY_HEADER_H  // 定义它,避免重复包含// 头文件内容
class MyClass { /* ... */ };#endif  // 结束条件编译

3. 多条件判断(#elif

#define VERSION 2#if VERSION == 1std::cout << "Running version 1\n";
#elif VERSION == 2std::cout << "Running version 2\n";  // 会执行这里
#elsestd::cout << "Unknown version\n";
#endif

4. 检查编译器或平台

#if defined(__linux__)std::cout << "Running on Linux\n";
#elif defined(_WIN32)std::cout << "Running on Windows\n";
#elif defined(__APPLE__)std::cout << "Running on macOS\n";
#endif

#if vs if

特性#if (预处理器)if (运行时条件)
执行阶段编译时(代码是否包含)运行时(决定执行哪段代码)
条件类型必须是宏或常量表达式(如 1+1可以是变量或动态表达式
用途条件编译、跨平台适配程序逻辑控制

示例对比

// #if (编译时决定)
#define USE_OPTIMIZATION 1
#if USE_OPTIMIZATIONoptimize_algorithm();  // 编译时会包含
#endif// if (运行时决定)
bool use_optimization = true;
if (use_optimization) {optimize_algorithm();  // 运行时决定是否执行
}

注意事项

  1. #if 不能检查变量的值(必须是宏或常量):

    int x = 10;
    #if x > 5  // 错误!x 不是编译时常量
    #endif
  2. #if 可以嵌套

    #if COND1#if COND2// ...#endif
    #endif
  3. #if 0 用于注释大段代码

    #if 0// 这段代码不会编译(相当于注释)deprecated_function();
    #endif


总结

  • #if 是预处理器指令,用于 条件编译(决定哪些代码参与编译)。

  • 常用场景

    • 调试开关(DEBUG 模式)

    • 跨平台适配(Windows/Linux/macOS)

    • 防止头文件重复包含(#ifndef + #define

  • 与 if 的区别#if 在编译时处理,if 在运行时处理。

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

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

相关文章

方案 | 动车底部零部件检测实时流水线检测算法改进

项目背景随着我国高速铁路运营里程突破4.5万公里&#xff0c;动车组日均开行超过8000列次&#xff0c;传统人工巡检方式已无法满足密集运行下的安全检测需求。车底关键部件如制动系统、悬挂装置、牵引电机等长期承受高强度振动和冲击&#xff0c;易产生疲劳裂纹、螺栓松动、部件…

企业收款统计:驱动业务决策的核心引擎设计开发——仙盟创梦IDE

代码完整代码<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><title>黑金风格职员统计</title><style>/* 页面基础样式 - 黑金风格 */body {font-family: Segoe UI, Tahoma, Geneva, Verdana, …

CIAIE 2025上海汽车内外饰展观察:从美学到功能的产业跃迁

在智能化、电动化浪潮推动下&#xff0c;汽车产业的市场格局、技术路线、供应链结构与用户体验正被系统性重塑。汽车感知空间核心的“内外饰件”&#xff0c;正从原本的结构性、功能性部件&#xff0c;逐步跃升为智能化、情感化和差异化体验的重要承载载体&#xff0c;开启了从…

Spring IOC容器在Web环境中的启动奥秘:深入源码解析

一、为何需要关注IOC容器启动&#xff1f;在Java Web开发中&#xff0c;Spring MVC框架的基石正是IOC容器。但你是否思考过&#xff1a;独立的IOC模块如何与Tomcat等Servlet容器协同工作&#xff1f; 其启动过程与Web容器的生命周期深度绑定&#xff0c;这是构建稳定Spring应用…

前端JS处理时间,适用于聊天、操作记录等(包含刚刚、x分钟前、x小时前、x天前)

export default {// 首页时间转化formatDate(val) {var nowDate new Date()var oldDate new Date(val)const Y oldDate.getFullYear()const M oldDate.getMonth() 1const D oldDate.getDate()var diff nowDate.getTime() - oldDate.getTime()var minutes Math.floor(di…

C#---StopWatch类

老方法&#xff0c;想要全面了解和学习一个类必先看文档 微软文档 1.StopWatch 提供一组方法和属性&#xff0c;可用来测量运行时间。 1.1 属性和方法 属性&#xff1a; 方法&#xff1a; 1.2 使用 using System.Diagnostics;namespace Study04_反射专题 {internal cla…

3DTiles转OSGB格式逆向转换方法研究

一、概述 在倾斜摄影的应用领域中&#xff0c;3DTiles与OSGB格式的互转是常见的技术需求。作为专业的GIS处理平台&#xff0c;GISBox凭借其先进的倾斜摄影反切功能&#xff0c;为用户提供了高效、稳定的跨格式数据转换解决方案。 二、3DTiles转OSGB的意义 保留原始几何与纹理…

【门诊进销存出入库管理系统】佳易王医疗器械零售进销存软件:门诊进销存怎么操作?系统实操教程 #医药系统进销存

前言&#xff1a; &#xff08;一&#xff09;试用版获取方式 资源下载路径&#xff1a;进入博主头像主页第一篇文章末尾&#xff0c;点击卡片按钮&#xff1b;或访问左上角博客主页&#xff0c;通过右侧按钮获取详细资料。 说明&#xff1a;下载文件为压缩包&#xff0c;使用…

华为交换机配置文件的相关命令和用法

文章目录一、基本配置命令一、基本配置命令 1、查看当前运行的配置文件 <Huawei>display current-configuration2、配置文件保存 <Huawei>save <Huawei>save vrpcfg-20250623.zip #保存为指定文件名3、查看保存的配置 <Huawei>display saved-configu…

【汽车标定数据】动态优先级线程池在异步多文件解析中的应用

目录 一、需求背景 项目背景&#xff1a;电控数据管理系统优化 优化方案&#xff1a;引入OLAP数据库和动态线程池 线程池性能急需解决的问题 资源过载与闲置的平衡&#xff1a; 优先级处理与公平性&#xff1a; 任务类型适配性&#xff1a; 二、线程池介绍 2.1、线程池…

Unity人形角色IK优化指南

目录 Unity中人形角色的IKI 站立、奔跑IK 1. 接触面法线 2. 调整质心位置 3. 保持原本朝向 攀爬IK 1. 四肢贴合 2. 保持身体与攀爬面的距离 3. 适应外拐角 瞄准IK 1. 头部朝向 2. 手臂朝向 尾声 本文将尝试仅使用Untiy内置的Animator来解决常见的几种运动所需的IK…

基于wireshark的USB 全速硬件抓包工具USB Sniffer Lite的使用

1、前言 随着MCU的发展和需求的增多&#xff0c;USB已成为主流MCU的标配外设&#xff0c;但很多还是全速或低速IP&#xff0c;因此往往用不上高速抓包设备。 2、安装wireshark和拷贝抓包插件 将抓包插件拷贝到wireshark的extcap目录里&#xff0c;可参考基于wireshark的USB …

easyexcel模板导出Map数据时空值列被下一行列非空数据覆盖

场景是&#xff1a;我用模板导出数据&#xff0c;sheet数据是一个List<String,Object>集合&#xff0c;然后发现第一行的第三列应该为空&#xff0c;但是不为空&#xff0c;填上了第二行的第三列数据&#xff1b;就像按列写数据&#xff0c;碰到空值&#xff0c;下一行数…

并行Builder-输出型流程编排的新思路

如果对于框架的介绍不感兴趣的可以直接跳到Getting Started快速开始 在设计一款数据加载编排框架时&#xff0c;除了任何框架都必须具备的可靠性与稳定性之外&#xff0c;对于本次编排框架的设计&#xff0c;我们把核心目标放在高性能与易用性上。这不仅要求框架能够快速、高效…

C#WPF实战出真汁03--登录界面设计

1、登录界面设计要点简洁直观的布局 登录界面应避免复杂元素&#xff0c;突出核心功能。通常包含用户名/邮箱输入框、密码输入框、登录按钮及可选功能&#xff08;如“记住我”“忘记密码”&#xff09;。保持表单字段不超过5个&#xff0c;减少用户认知负担。清晰的视觉层次 通…

前端css学习笔记6:盒子模型

本文为个人学习总结&#xff0c;如有谬误欢迎指正。前端知识众多&#xff0c;后续将继续记录其他知识点&#xff01; 目录 前言 一、组成 ​编辑content padding border margin margin塌陷 margin合并 使用场景 标题与段落间距 卡片列表布局 二、内容溢出—overflo…

以下是对智能电梯控制系统功能及系统云端平台设计要点的详细分析,结合用户提供的梯控系统网络架构设计和系统软硬件组成,分点论述并补充关键要点:

智能电梯控制系统功能及系统云端平台设计要点一、梯控系统网络架构设计服务本地化&#xff1a;电梯门禁服务器本地化部署&#xff1a;核心服务器部署在项目本地&#xff0c;确保数据安全、运维及时性&#xff0c;减少网络依赖。需支持本地独立运行&#xff0c;避免云端故障影响…

全球电商业财一体化:让出海品牌实现“看得见的增长“

内外贸并行的数字化挑战在数字经济浪潮下&#xff0c;中国品牌呈现"双轮驱动"增长态势&#xff1a;一边深耕天猫、京东、抖音等国内主流平台&#xff0c;一边通过Amazon、Tiktok、eBay、Temu等渠道拓展全球市场。然而&#xff0c;多平台、多币种、多地区的复杂运营环…

Nacos-5--Nacos2.x版本的通信原理

Nacos 2.x引入了gRPC作为其主要的通信协议&#xff0c;取代1.x版本中的HTTP长轮询和UDP通信方式&#xff0c;显著提升了性能、实时性和稳定性。gRPC是一个高性能、开源的远程过程调用&#xff08;RPC&#xff09;框架&#xff0c;它基于HTTP/2标准设计&#xff0c;并使用Protoc…

如何以开发者的身份开发出比python更好的应用软件?

作为一名拥有多年软件架构经验的开发者,我见证了Python从实验室脚本语言成长为数字时代基础设施的完整历程。2008年我参与欧洲核子研究中心的粒子数据分析系统时,Python还是辅助工具,而今天它已成为驱动LIGO引力波探测的核心引擎——这种跃迁绝非偶然。 一、Python的巅峰应…