预处理

内容简介

预处理发生在正式编译之前,主要处理 #include、宏定义、条件编译和头文件保护。C/C++ 的典型构建流程是:预处理 -> 编译 -> 汇编 -> 链接。

用法

include

#include <stdio.h>      // 系统或标准库头文件
#include "my_header.h"  // 当前项目头文件

宏定义

#define MAX_COUNT 100
#define MAX(a, b) ((a) > (b) ? (a) : (b))

条件编译

#ifdef DEBUG
printf("debug mode\n");
#endif

头文件保护

#ifndef MY_HEADER_H
#define MY_HEADER_H
 
void func(void);
 
#endif

或使用:

#pragma once

最佳代码实践

  • 项目头文件使用双引号,标准库头文件使用尖括号。
  • 头文件必须有防重复包含机制。
  • 宏常量在 C++ 中优先替换为 constexprconst
  • 有参数宏要给参数和整体表达式加括号。
#define SQUARE(x) ((x) * (x))

错误用法

#define SQUARE(x) x * x
int value = SQUARE(1 + 2);  // 展开为 1 + 2 * 1 + 2,结果错误
#include "stdio.h"  // 不一定错误,但标准库头文件更推荐用 <stdio.h>

注意事项

  • 宏是文本替换,没有类型检查,调试也不如函数方便。
  • C++ 中有参宏通常可以用 inline 函数、模板或 constexpr 替代。
  • #pragma once 很方便,但严格说不是 C/C++ 标准的一部分;主流编译器基本都支持。

编译详情:CandCpp底层知识 > 编译原理

学习路径