ここに世界で最も簡単なプログラムがあります。何が問題なのかを理解するのに 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 と競合しないようにしましたが、機能していないようです。どうしたの?