313 字
1 分钟
【C】预处理编译与项目结构
2026-05-19

编译流程总览#

源代码(.c) → 预处理器 → 编译器 → 汇编器 → 链接器 → 可执行文件

阶段命令示例输出
预处理gcc -E source.c -o source.i.i
编译gcc -S source.i -o source.s.s
汇编gcc -c source.s -o source.o.o
链接gcc source.o -o program可执行文件

预处理#

-E:只运行预处理器,不编译、不汇编、不链接。

主要工作:

  • 处理以 # 开头的指令
  • 展开 #include、替换 #define、条件编译
  • 删除注释

#include — 文件包含#

#include <stdio.h> // 系统头文件路径
#include "myheader.h" // 当前目录或 -I 指定路径

#define — 宏定义#

#define PI 3.14159
#define MAX_SIZE 100
#define ADD(a, b) ((a) + (b)) // 带参宏,注意括号
#define PRINT_HELLO \
printf("Hello\n"); \
printf("World\n")
  • 宏是文本替换,无类型检查;复杂逻辑优先用 inline 函数或普通函数
  • 多行宏用 \ 续行;续行后不要缩进多余空格进宏体

#undef#

取消已定义的宏。

条件编译#

#define VERSION 2
#if VERSION == 1
/* ... */
#elif VERSION == 2
/* ... */
#else
/* ... */
#endif
#ifdef DEBUG
printf("debug\n");
#endif
#ifndef MYHEADER_H
#define MYHEADER_H
/* 头文件内容 */
#endif

#ifndef / #define / #endif头文件保护,防止重复包含。

typedef 与 #define#

13-结构体联合体与枚举 中的对比表。

头文件规范#

头文件 (.h) 宜包含:

  • 头文件保护宏
  • 函数声明(原型)
  • 宏、typedef
  • 结构体 / 联合体 / 枚举声明
  • extern 全局变量声明(非定义)

不宜在头文件中:

  • 定义普通函数(除非 static inline 且明确需要)
  • 定义全局变量(会导致多重定义)

简易 C 项目结构#

my_c_project/
├── bin/ # 可执行文件输出
│ └── app.exe
├── include/ # 公共头文件
│ ├── module1.h
│ └── module2.h
├── src/ # 源文件
│ ├── main.c
│ ├── module1.c
│ └── module2.c
└── lib/ # 第三方库(可选)

在项目根目录编译示例:

gcc ./src/*.c -I./include -o ./bin/app.exe

大型项目建议使用 Makefile 或 CMake 管理依赖与编译选项。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

【C】预处理编译与项目结构
https://lysj.work/posts/studynotes/c/c预处理编译与项目结构/
作者
Sekiro
发布于
2026-05-19
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录