69

特別なファイルを定義しました:config.h

私のプロジェクトにはファイルもあります:

t.c, t.h
pp.c, pp.h
b.c b.h
l.cpp

および #includes:

で:

    #include "t.h"
    #include "b.h"
    #include "pp.h"
    #include "config.h"

紀元前:

    #include "b.h"
    #include "pp.h"

pp.cで:

    #include "pp.h"
    #include "config.h"

l.cpp:

    #include "pp.h"
    #include "t.h"
    #include "config.h"

私のファイルには include ディレクティブはありません。ファイル*.hのみ*.cです。これをconfig.hで定義しました:

const char *names[i] =
        {
            "brian", "stefan", "steve"
        };

l.cpp、tc、pp.cでその配列が必要ですが、次のエラーが発生します:

pp.o:(.data+0x0): multiple definition of `names'
l.o:(.data+0x0): first defined here
t.o:(.data+0x0): multiple definition of `names'
l.o:(.data+0x0): first defined here
collect2: ld returned 1 exit status
make: *** [link] Error 1

プロジェクトで使用するすべての*.hファイルにガードを含めています。これを解決する助けはありますか?

4

3 に答える 3

46

パブリック関数の宣言はヘッダー ファイルで行いますが、定義はヘッダーでも完全に有効です。各 c ファイルで再度定義する必要のないユーティリティ関数のヘッダーで何かを定義している場合は、定義を静的 (プログラム全体で 1 つのコピーのみ許可) として宣言できます。列挙型と列挙型を文字列に変換する静的関数を定義するIE。そうすれば、ヘッダーを含む .c ファイルごとに enum から文字列へのトランスレーターを書き直す必要がなくなります。:)

于 2014-08-15T19:12:50.377 に答える
0

ヘッダー ファイルで定義を静的にします。

于 2022-02-07T04:58:48.090 に答える