补充说明
cpp 是 GNU C 预处理器,负责展开宏、包含头文件、处理条件编译,并输出预处理后的源码。通常不直接调用,而是由 gcc -E 隐式调用;独立使用便于调试宏展开或生成依赖关系。
它是 GCC 的一部分(Debian/RHEL 的 gcc 包提供)。常见用途:排查宏定义问题、查看某个头文件展开结果、生成 Makefile 依赖。预处理器不了解完整的 C 语法,#if 中的表达式按整数常量规则求值,sizeof 等不能在其中使用。
默认按 C 处理;用 -x c++ 可处理 C++。输出默认写到标准输出,行首的 # 行号 "文件" 标记可用 -P 去掉。调试时结合 -dM 打印所有预定义宏很有用。注意 -I 添加的目录按顺序搜索,系统头文件目录仍会在其后参与查找。
语法
cpp [选项] [输入文件] [输出文件]
选项
-D 名字[=值]:定义宏;-U 名字:取消宏定义;-I 目录:添加头文件搜索目录;-include 文件:在处理输入前先包含该文件;-M/-MM:输出 Makefile 依赖规则(-MM忽略系统头文件);-P:不输出行标记;-C:保留注释;-dM:只输出所有宏定义;-x 语言:指定输入语言(如c、c++)。
实例
# 查看文件预处理结果
cpp hello.c
# 只列出编译器预定义宏
cpp -dM /dev/null | grep __linux__
# 生成 Makefile 依赖
cpp -MM main.c
# 手动指定宏和头文件目录
cpp -DDEBUG=1 -I./include main.c
# 处理 C++ 源码
cpp -x c++ app.cpp