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

C++ 零散记录:条件编译与 if constexpr 的区别

核心区别

条件编译发生在预处理期,由预处理器根据条件关掉代码片段,即不让这些代码到达编译期。

if constexpr:发生在编译期,由编译器在编译期确定要执行的分支。

其他所有的区别都是此核心区别的衍生。

用法的区别

能放的位置

条件编译几乎在哪都行。

if constexpr 只能在函数体内(当然,含类的成员函数),因为它是个语句。

对语法的要求

条件编译中,被切掉的分支可以不符合语法。因为预处理在编译之前,编译器看不到被切掉的部分。

if constexpr 中,未选中的分支会不产生机器码,但必须符合语法。因为这是由编译器来干的。

容易看出,这些区别都是核心区别的直接推论。

使用场景

由上述区别,可以容易得出:

如果需要在编译前介入,比如条件编译。例如,编写多平台程序。

#ifdef FOO_WINDOWS
#include <windows.h>
#endif
#ifdef FOO_LINUX
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#endif#ifdef FOO_WINDOWS
int openFile(const std::string& path)
{// ...CreateFile(...);// ...
}
#endif#ifdef FOO_LINUX
int openFile(const std::string& path)
{// ...open(...);// ...
}
#endif

本例中,给 Windows 和 Linux 分别实现打开文件的程序,用条件编译让这段代码可以在两个平台上编译。在其中一个平台上,针对另一个平台的代码是无法编译的。

http://www.wxhsa.cn/company.asp?id=5727

相关文章:

  • ubuntu 22.04安装mysql8.0.41(glibc2.17)
  • cURL调试功能磁盘空间耗尽导致拒绝服务漏洞分析
  • mysql常用函数,数据处理效率提升实战指南
  • Tita 一体化管理:赋能互联网企业产品迭代全流程
  • 【2025-09-15】动起来了
  • 二叉树的层次遍历
  • Mysql索引失效场景
  • 农田水利综合信息管理平台
  • 写了一个BBP算法的实现库,欢迎讨论
  • 统计建模库 statsmodels(时序单变量数据)
  • 【云栖大会】AI原生、AI可观测、AI Serverless、AI中间件,4场论坛20+议题公布!
  • docker-oracle安装
  • static注意事项
  • 微算法科技(NASDAQ: MLGO)研究隐私计算区块链框架,赋能敏感数据流通
  • 2D变换——坐标系
  • 关于POST NETLIST (后提网表)备注
  • P13693 [CEOI 2025] Equal Mex 题解
  • 力扣46题 全排列
  • C++ std::unordered_map
  • Rust mut
  • 数论与组合(模板)
  • 自动感应门的感应雷达怎么选型?
  • hadoop部署步骤
  • 达成调用libchdb.a静态连接库中的未公开导出函数
  • 一些寄存器相关的知识
  • Redis常用命令
  • 力扣42题 接雨水,力扣84题 柱状图中最大的矩形,力扣739题 每日温度
  • 使用HTTPS 服务在浏览器端启用摄像头的方式解析
  • 5分钟SAE极速部署Dify,高效开发AI智能体应用
  • .NET驾驭Word之力:理解Word对象模型核心 (Application, Document, Range)