1

解決方法がわからない C の問題があります。4 つの c ファイル ac があるとします。紀元前; cc; dc であり、それぞれに .h ファイルがあります。bh ; チャンネル; dh、もちろん含まれています。私は次のことをしたい:

ああ、含まれます:

#include "b.h"
#include "c.h"
...

bh には以下が含まれます。

#include "d.h"
...

ch には以下も含まれます。

#include "d.h"
...

dh で構造体を定義します。たとえば、dh の内容は次のようになります。

typedef struct address { 
   int address; 
} address;

問題は、エラーが発生することです(ファイルをコンパイルすると):

In file included from c.h:1:0,
                 from a.h:2,
                 from a.c:1:
d.h:3:16: error: redefinition of ‘struct address’
d.h:3:16: note: originally defined here
d.h:5:3: error: conflicting types for ‘address’
d.h:5:3: note: previous declaration of ‘address’ was here

なぜそれが起こっているのか理解しています(プリプロセッサが定義を2回インポートするため)が、どうすれば解決できますか?インクルードをそのようにする必要があります(もちろん、もっと多くのファイルがあるため、これは単なる例です)。私に何ができる?

注:私のメイクファイルは:

project: a.o b.o c.o d.o
    gcc -g a.o b.o c.o d.o -ansi -Wall -pedantic -o output

a.o: a.c a.h  b.c b.h c.c c.h d.c d.h 
    gcc -c a.c -ansi -Wall -pedantic -o a.o

b.o: b.c b.h d.c d.h
    gcc -c b.c -ansi -Wall -pedantic -o b.o

c.o: c.c c.h d.c d.h
    gcc -c c.c -ansi -Wall -pedantic -o c.o

d.o: d.c d.h
    gcc -c d.c -ansi -Wall -pedantic -o d.o

大丈夫だと思います..それは私にとってはうまくいきました。お手伝いありがとう。

4

3 に答える 3

3

各ヘッダー ファイルの内容をプリプロセッサ ガードで囲みます。

/* a.h */
#ifndef A_H_
#define A_H_

/* content of a.h goes here */

#endif

他のヘッダーについても同じです。

/* b.h */
#ifndef B_H_
#define B_H_

/* content of b.h goes here */

#endif

等々。

これは、各ヘッダーの内容が 1 回だけ読み取られるようにする通常の方法です。(初回読み込み時はシンボル[eg B_H_]がまだ定義されていないのでifndef真となり、内容を読み込みます。2回目以降はシンボル定義し、内容を読み飛ばします。)

シンボルの名前A_H_は任意ですが、通常は大文字で書かれたヘッダーの名前を使用します。したがって、ガードに異なる名前を使用しない限り、同じ名前の 2 つの異なるヘッダーを含めるとすぐに、メカニズムは失敗します。

#pragma once多くのプリプロセッサがサポートしていますが、標準ではありません。

于 2013-08-13T13:46:26.747 に答える
0

「includeguards」を使用して、プリプロセッサがヘッダー ファイルの内容を前処理済みのソース コードに何度も挿入するのを防ぐことができます。

使用する

#ifndef A_H_
#define A_H_

というシンボルを定義しますA_H_。プリプロセッサがこのシンボルにもう一度ヒットすると、その間にあるものは無視されます

#ifndef A_H_
#define A_H_

#endif

のような特定のコンパイラ コマンドもあります#pragma once。これは、たとえば Visual Studio で機能し、インクルード ガードと同じように機能します。コンパイラがそのようなものを提供しているかどうかを確認してください。

于 2013-08-13T13:48:44.117 に答える
0

1 回限りのヘッダーを追加します。詳細については、以下のリンクを参照してください。

http://gcc.gnu.org/onlinedocs/cpp/Once_002dOnly-Headers.html#Once_002dOnly-Headers

于 2013-08-13T13:53:59.073 に答える