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):逐步替代头文件包含机制
相关推荐
倒头就睡的小比特3 天前
算法竞赛C++常用的STL
c++·算法
weilx12343 天前
C++笔记-文件IO-<fcntl.h>
c++
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
伞伞悦读3 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
Smileyqp沛沛3 天前
前端?C++ ?较大差异基础罗列
c++·基础·前端转c++
C语言小火车3 天前
C/C++ 为什么需要编译器?
开发语言·c++
旖旎夜光3 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
吞下星星的少年·-·3 天前
C++ 萌新语法入门篇
c++·算法比赛
霍霍的袁3 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
another heaven3 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法