C++ 预处理器

C++ 预处理器概述

C++ 预处理器是编译过程中的一个独立阶段,负责在代码被编译器处理前执行文本替换和文件操作。它不分析 C++ 语法,而是直接处理以 # 开头的指令。

主要预处理指令

#include 用于将其他文件的内容插入到当前文件中。常见形式:

cpp 复制代码
#include <iostream>  // 标准库头文件
#include "myheader.h" // 用户自定义头文件

#define 用于定义宏。宏可以是对象宏或函数宏:

cpp 复制代码
#define PI 3.14159
#define MAX(a,b) ((a) > (b) ? (a) : (b))

条件编译指令 允许根据条件选择性地包含代码:

cpp 复制代码
#ifdef DEBUG
    // 调试专用代码
#endif

#if __cplusplus >= 201103L
    // C++11及以上版本代码
#endif

#pragma 编译器特定的指令,如:

cpp 复制代码
#pragma once  // 防止头文件重复包含

预定义宏

C++ 提供了一些内置宏:

cpp 复制代码
__LINE__  // 当前行号
__FILE__  // 文件名
__DATE__  // 编译日期
__TIME__  // 编译时间
__cplusplus  // C++标准版本

注意事项

宏展开是纯文本替换,可能导致意外行为:

cpp 复制代码
#define SQUARE(x) x*x
SQUARE(1+1)  // 展开为 1+1*1+1 = 3 而非预期的4

应使用括号确保正确性:

cpp 复制代码
#define SQUARE(x) ((x)*(x))

现代C++替代方案

C++11 后推荐使用以下替代方案:

  • 常量:constexpr 替代对象宏
  • 内联函数:替代函数宏
  • 静态断言:static_assert 替代部分编译时检查
  • 模块(C++20):逐步替代头文件包含机制
相关推荐
Chester_19991 小时前
CSP202203C.计算资源调度器
开发语言·数据结构·c++·蓝桥杯
EXI-小洲3 小时前
Java 操作 Word:字符串替换、图片插入、动态生成表格与API接口下载
java·开发语言·spring boot·word
会周易的程序员3 小时前
给 PLC 写一个字节码虚拟机:STVM 虚拟机架构设计
开发语言·c++·虚拟机·软plc·iec61131·stvm
机器视觉知识推荐、就业指导3 小时前
为什么老说“纯 Qt 没啥就业市场”?
开发语言·qt
telepan3 小时前
Qt 开发避坑与性能指南:如何优雅、安全地定义全局常量字符串?
开发语言·qt
小灰灰搞电子3 小时前
完全驾驭 Qt 与数据库:C++ ORM 框架 QxOrm 原理与实践指南
数据库·c++·qt
QT界面美化性能优化3 小时前
QT+AI:使用AI技术为QT应用程序赋能
c++·人工智能·qt·opencv·qt教程·qt6.3
m0_695251493 小时前
Qt MaintenanceTool 使用国内镜像加速下载(超详细教程)
开发语言·qt
大衛說5 小时前
《Python 从入门到精通》系列总览与学习路线
开发语言·python·学习
学习星球6 小时前
单调栈——从“找下一个更大的“到柱状图中的最大矩形
数据库·c++·算法·leetcode·xcode