首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Visual Studio C++ 包含 .cpp 文件導致重複定義錯誤:正確做法是建立 .h 頭文件聲明,.cpp 實現分離編譯

     編輯:程式設計綜合問答

錯誤現場

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++ 多文件組織

1. 頭文件 `c.h` — 僅聲明

// c.h
#pragma once  // 或 #ifndef C_H ... #endif
void func(); // 函數聲明
extern int globalVar; // 變量聲明

2. 實現文件 `c.cpp` — 定義

// c.cpp
#include "c.h"
#include 

void func() {
    std::cout << "Hello from c.cpp\n";
}

int globalVar = 42; // 定義

3. 主文件 `main.cpp` — 使用

// main.cpp
#include "c.h" // 只包含頭文件!
#include 

int main() {
    func(); // 調用聲明的函數
    std::cout << globalVar << std::endl;
    return 0;
}

4. 編譯鏈接命令 (手動/構建系統自動)

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**。

為什麼教程偶爾出現 #include "xxx.cpp"?

  • 極簡教學演示「單文件多函數」,為了省去項目配置,違反工程規範。
  • 模板類/內聯函數**定義必須在頭文件中**(或 .inl 包含在頭文件尾部),這是**唯一合法**在頭文件見定義的場景。

避坑清單

  • .h 只放聲明、宏、內聯/模板定義;.cpp 放非內聯定義。
  • 頭文件防重複包含:`#pragma once` (MSVC/GCC/Clang 通用) 或傳統 `#ifndef GUARD`。
  • 變量聲明用 `extern`,定義只在一個 .cpp 中**。
  • 項目屬性 → C/C++ → General → Additional Include Directories** 添加頭文件目錄,而非把 .cpp 加入包含路徑。

「聲明在 .h,定義在 .cpp,包含 .h,項目加 .cpp」—— C++ 分離編譯鐵律,牢記不再踩坑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved