main.cpp 中 #include "c.cpp",編譯報錯:
error LNK2005: "void __cdecl func(void)" (?func@@YAXXZ) already defined in main.obj
或 error C2084: function '...' already has a body。
#include 只是**文本展開**。
- 編譯 main.cpp 時,c.cpp 內容被複製進來 → 生成 main.obj 含 func() 定義。
- 編譯 c.cpp 時,又生成 c.obj 含同樣 func() 定義。
- 鏈接器合併 main.obj + c.obj → **重複定義 (ODR 違規)**。
// c.h
#pragma once // 或 #ifndef C_H ... #endif
void func(); // 函數聲明
extern int globalVar; // 變量聲明
// c.cpp
#include "c.h"
#include
void func() {
std::cout << "Hello from c.cpp\n";
}
int globalVar = 42; // 定義
// main.cpp
#include "c.h" // 只包含頭文件!
#include
int main() {
func(); // 調用聲明的函數
std::cout << globalVar << std::endl;
return 0;
}
cl /c main.cpp // 生成 main.obj
cl /c c.cpp // 生成 c.obj
link main.obj c.obj /out:main.exe
VS 中只需將 c.cpp 加入項目(Solution Explorer → 右鍵 Add → Existing Item),IDE 自動編譯鏈接,**無需在 main.cpp 中 #include c.cpp**。
.inl 包含在頭文件尾部),這是**唯一合法**在頭文件見定義的場景。「聲明在 .h,定義在 .cpp,包含 .h,項目加 .cpp」—— C++ 分離編譯鐵律,牢記不再踩坑。