C プロジェクトで「エラー LNK2005: すでに定義されています」が発生するのはなぜですか?

Susan Sarandon
リリース: 2024-11-02 11:16:02
オリジナル
621 人が閲覧しました

Why am I Getting

エラー LNK2005 の謎を明らかにする: 複数の定義を理解する

プロジェクト内で複数の C ファイルを操作すると、「エラー LNK2005、すでに「定義済み」というメッセージが厄介な障害になる可能性があります。このエラーは、プロジェクト内に同じ変数または関数の複数の定義が存在することを示します。この問題を詳しく調べるために、具体的な例を見てみましょう。

問題のあるシナリオ

A.cpp と B.cpp の 2 つのファイルで構成される Win32 コンソール アプリケーションについて考えてみましょう。どちらのファイルにも次の内容のみが含まれています:

#include "stdafx.h"
int k;
ログイン後にコピー

コンパイル時にエラーが発生します:

Error 1 error LNK2005: "int k" (?a@@3HA) already defined in A.obj
ログイン後にコピー

問題の根本: 1 つの定義ルールに違反しています

このエラーの根底にある基本原則は、C で強制される「1 つの定義ルール」(ODR) です。このルールは、プロジェクト全体を通じて、変数または関数が最終的な定義を 1 つだけ持つことができることを規定します。このシナリオでは、A.cpp と B.cpp の両方が同じ変数 'k' を定義しようとし、ODR に違反します。その結果、リンカで競合が発生し、エラー メッセージが表示されます。

問題への対処

このエラーを解決するには、次の 2 つの主なアプローチを使用できます。

アプローチ 1: 名前のない名前空間の利用

複数の翻訳単位 (cpp ファイルなど) で同じ変数を共有することが目的の場合は、名前のない名前空間の利用を検討してください。名前のない名前空間は変数を独自のスコープ内でカプセル化し、そのスコープ外からはアクセスできないようにします。

namespace {
    int k;
}
ログイン後にコピー

アプローチ 2: 外部変数

必要に応じて、別の方法として、複数のファイル間で変数を共有しているが、外部コードへのアクセス性を維持したい場合は、「extern」キーワードを使用します。このアプローチには、ヘッダー ファイル (例: A.h):

extern int k;
ログイン後にコピー

で変数を宣言し、その後実装ファイル (例: A.cpp) の 1 つで変数を定義することが含まれます:

#include "A.h"
int k = 0;
ログイン後にコピー

以上がC プロジェクトで「エラー LNK2005: すでに定義されています」が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート