313 字
1 分钟
【C】预处理编译与项目结构
编译流程总览
源代码(.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预处理编译与项目结构/ 部分信息可能已经过时
相关文章 智能推荐
