Skip to content

为什么 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++ 编译和链接流程,可以继续提问!