为什么 C++ project 只包含头文件,不要包含 CPP 文件:
1. C++ 编译流程
- 每个
.cpp文件会被单独编译成一个目标文件(.obj)。 - 头文件(
.h)通常只包含声明(比如类、函数的声明),不会生成实际代码。 - 源文件(
.cpp)包含实现(函数体等),编译器会为每个.cpp文件生成一份实现。
2. 包含头文件的作用
- 头文件用于声明,让编译器知道有哪些类、函数可以用。
- 头文件不会生成实际的代码,只是告诉编译器“有这个东西”。
3. 包含 CPP 文件的后果
- 如果你在一个
.cpp文件里#include了另一个.cpp文件,
就等于把那个文件的全部实现复制到当前文件。 - 这样,原本应该只在一个目标文件里出现的函数实现,
会在多个目标文件里都出现一份。 - 链接器(Linker)在最后合并所有目标文件时,发现有重复的实现,
就会报“重复定义”错误(multiple definition)。
4. 正确做法
- 只在
.cpp文件里包含头文件(.h),这样每个实现只会编译一次。 - 头文件里只放声明,源文件里放实现。
举例说明
假如你有:
cpp
// WelcomeWindow.xaml.h
class WelcomeWindow {
public:
void Show();
};cpp
// WelcomeWindow.xaml.cpp
#include "WelcomeWindow.xaml.h"
void WelcomeWindow::Show() { /* ... */ }你应该在其他 .cpp 文件里这样用:
cpp
#include "WelcomeWindow.xaml.h"
// 使用 WelcomeWindow不要这样:
cpp
#include "WelcomeWindow.xaml.cpp" // 错误!会导致重复实现总结
- 头文件只声明,不实现。
- 源文件实现,只编译一次。
- 包含 CPP 文件会导致重复实现,链接器报错。
如需更深入理解 C++ 编译和链接流程,可以继续提问!