引言
在 Linux C/C++开发中,不同文件后缀代表着不同的编译阶段和用途。作为开发者,理解这些后缀的含义不仅有助于构建系统,还能在调试和优化时提供重要线索。本文将基于 QEMU 项目中 virtio-balloon 组件的实际文件,深入剖析每个文件后缀的意义及其在编译流程中的角色。
一、源码文件:编译的起点
1.1 C 源文件 (.c)
// mod/BUILD/qemu-4.1.0/hw/virtio/virtio-balloon.c
// 这是主要的 C 语言源文件,包含函数实现和业务逻辑
#include "virtio-balloon.h"
static void virtio_balloon_handle_output(VirtIODevice *vdev, VirtQueue *vq) {
// 实际的功能实现
}
1.2 C++ 源文件 (.cc/.cpp/.cxx)
虽然本示例中未出现,但需要了解:
.cc: GNU 标准扩展(常见).cpp: C++ 标准扩展.cxx: Unix 传统扩展
1.3 头文件 (.h)
// mod/BUILD/qemu-4.1.0/include/hw/virtio/virtio-balloon.h
// 声明接口和数据结构,不包含实现细节
#ifndef VIRTIO_BALLOON_H
#define VIRTIO_BALLOON_H
struct VirtIOBalloon {
VirtIODevice parent_obj;
uint32_t num_pages; // 更多声明...
};
#endif
头文件的作用:
- 声明函数原型、宏定义、类型定义
- 提供接口契约
- 实现模块间的解耦
二、编译中间文件:构建过程的见证者
2.1 预处理文件 (.i) - 预编译阶段
# 生成预处理文件 gcc -E virtio-balloon.c -I./include -o virtio-balloon.i
预处理阶段的关键操作:
- 展开所有宏定义 (
#define) - 处理条件编译指令 (
#ifdef,#ifndef)


