3

私は比較的 C に慣れていません (C++ を使用したくないため、または少なくともまだ使用したくないため)、発生しているインクルード エラーを修正する方法がわかりません。

定数値 1000 を含む Test という名前のヘッダー ファイルがあります。

const int Test = 1000;

このファイルは 2 つのファイルに含まれています。 Myfile.c と Myfile2.c にはそれぞれファイルが含まれています。

#include "MyHeader.h"

私のプロジェクトはビルド/コンパイルされません。変数「Test」を2回宣言しているため、ヘッダーが2回含まれていることがわかりました。調査の結果、ウィキペディアでこれを見つけました:http://bit.ly/10wPraP

この「インクルードガード」を使いました

例:

#ifndef MY_HEADER
#define MY_HEADER
 const int Test = 1000;
#endif

また、プリプロセッサ (?) コマンド プラグマも 1 回試しました。

#pragma once

ただし、私のプログラムはまだビルドされません。変数 "Test" が MyFile.obj で既に定義されているというエラーが表示されるようになりました。

私はそれを使用しているので、これは Visual Studio-ism である可能性があると思いましたが、私の 2010 Express C++ と VS2003 Professional の両方がこれをビルドしません。Visual Studio 内でプロジェクトをクリーンアップしようとしましたが、他に何をすべきかわかりません。

私は非常にばかげていて、ここで明らかな何かを見逃していますか?それが機能しない理由ですか?

私はC#に慣れており、インクルードではなく名前空間を「使用」しています。CコードのみをコンパイルするようにVSで設定すると、これに影響する可能性がありますか?

4

4 に答える 4

8

インクルードガードはそれとは何の関係もありません。宣言を定義から分離し、定義を1つだけにする必要があります(これは「1つの定義ルール」、ODRと呼ばれます)。

header.h:

extern const int n;

1つのソースファイル:

#include "header.h"

const int n = 1000;

他のすべてのソースファイル:

#include "header.h"
于 2013-01-15T17:57:21.403 に答える
3

便利なリファレンス:

問題は、ヘッダーファイルを#includeした場合の処理​​方法にあります。ヘッダーファイルは文字通りコピーされ、Cファイルの本文に貼り付けられます。これは、Myfile.cとMyfile2.cの両方に、Testという名前のintの独自の宣言があることを意味します。つまり、1つの変数の2つの異なるバージョンを作成します。次に、リンカは、同じ名前の2つの異なる変数があることについて文句を言います。

const int Test = 1000;解決策は、Cファイルの1つに入れて、 extern const int Test;MyHeader.hに追加することです。externこのように、変数は1回だけ宣言され、ディレクティブは別のファイルにTest探している変数があることを通知するため、すべてのファイルが1つの変数を認識します。

MyHeader.h

extern const int Test;

Myfile.c(たとえば)

#include "MyHeader.h"
...
const int Test = 1000;

Myfile2.c

#include "MyHeader.h"
...
<use Test>
于 2013-01-15T17:55:53.637 に答える
0

正解です。を定義 している 2 つのソース ファイルがありますTest。これは一度だけ定義する必要があります。ヘッダー ファイルはあらゆる場所に含まれるため、通常は変数を宣言するだけで、定義する必要はありません。例えば

ヘッダ:

const int Test;

ちょうど 1 つの c ファイル:

const int Test = 1000;

于 2013-01-15T17:58:06.750 に答える
0

ファイルのいずれかでその変数を定義し.c、ヘッダー ファイルで extern として宣言します。

#ifndef MY_HEADER
#define MY_HEADER
 extern const int Test;
#endif

変数Myfile.cを定義する

const int Test = 1000;
于 2013-01-15T17:58:54.370 に答える