4

ここに世界で最も簡単なプログラムがあります。何が問題なのかを理解するのに 1 秒しかかからない人もいると思います。

foo.h:

#ifndef FOO_H
#define FOO_H

namespace foo
{
    char str[ 20 ];

    void bar(char* s);
}

#endif

foo.cpp:

#include "foo.h"

using namespace std;

namespace foo
{
    void bar(char* s) {
        return;
    }
}

foo_main.cpp:

#include "foo.h"

using namespace std;
using namespace foo;

int main(void)
{
    bar( str );
}

これら3つを一緒にコンパイルしようとすると:

g++ foo_main.cpp foo.cpp -o foo

/tmp/cc22NZfj.o:(.bss+0x0): multiple definition of `foo::str'
/tmp/ccqMzzmD.o:(.bss+0x0): first defined here
collect2: ld returned 1 exit status

名前空間 foo 内で str をグローバルとして使用したいので、そのままにしておく必要があります。メイン メソッドを foo.cpp に移動すると、正常にコンパイルされます。main メソッドを別のファイルに残したい場合はどうすればよいですか? ご覧のとおり、.h ファイルにインクルード ガードを配置して、str と競合しないようにしましたが、機能していないようです。どうしたの?

4

2 に答える 2

6

他のグローバルと同様に、使用する必要がある場所で宣言し、1 か所でのみ定義します。では、foo.hとしてマークしexternます。次に、 で定義しfoo.cppます。

于 2012-09-02T21:43:42.487 に答える
3

include ディレクティブは、インクルード ファイルの内容を文字通り、#include. char str[ 20 ];したがって、両方のcpp ファイルで定義を行うことになり、したがって 2 回になります。

書く

extern char str[ 20 ];

ヘッダーファイルに入れます

char str [ 20 ];

cppファイルの1つだけに。

于 2012-09-02T21:46:25.180 に答える