首頁 > 後端開發 > C++ > 主體

為什麼我的 C 專案中出現「錯誤 LNK2005:已定義」?

Susan Sarandon
發布: 2024-11-02 11:16:02
原創
551 人瀏覽過

Why am I Getting

揭開錯誤LNK2005 的神秘面紗:理解多個定義

在專案中處理多個C 檔案時,「錯誤LNK2005,已經定義的」訊息可能是一個令人困惑的障礙。此錯誤表示專案中存在同一變數或函數的多個定義。為了深入研究這個問題,讓我們來看一個具體的例子。

有問題的場景

考慮一個包含兩個檔案的 Win32 主機應用程式:A.cpp 和 B.cpp。兩個檔案都只包含以下內容:

#include "stdafx.h"
int k;
登入後複製

編譯時出現錯誤:

Error 1 error LNK2005: "int k" (?a@@3HA) already defined in A.obj
登入後複製

問題根源:違反單一定義規則

問題根源:違反單一定義規則

問題根源>這個錯誤背後的基本原理是C 中強制執行的「單一定義規則」(ODR)。這項規則規定任何變數或函數在整個專案中只能有一個明確的定義。在這種情況下,A.cpp 和 B.cpp 都嘗試定義相同的變數“k”,違反了 ODR。因此,連結器遇到衝突並觸發錯誤訊息。

解決問題

要解決此錯誤,您可以採用兩種主要方法:

方法1:利用無名命名空間

namespace {
    int k;
}
登入後複製
如果您打算在多個翻譯單元(即cpp 檔案)之間共用相同變量,請考慮使用無名命名空間。無名命名空間將變數封裝在自己的作用域內,使其在該作用域之外無法存取。

方法2:外部變數

extern int k;
登入後複製
或者,如果您需要在多個檔案之間共用一個變數,但希望保持其對外部程式碼的可訪問性,請使用“extern”關鍵字。此方法涉及在頭檔(例如 A.h)中宣告變數:

#include "A.h"
int k = 0;
登入後複製
,然後在其中一個實作檔案(例如 A.cpp)中定義它:

以上是為什麼我的 C 專案中出現「錯誤 LNK2005:已定義」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!