4

我这里有世界上最简单的程序。我想你们中的一些人只需要一秒钟就可以找出问题所在。

富.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 );
}

现在,当我尝试将这三个编译在一起时:

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 作为全局变量,因此需要将其保留在那里。如果我将我的 main 方法移动到 foo.cpp 中,那么一切都可以正常编译。如果我想将我的主要方法留在一个单独的文件中,我该怎么办?如您所见,我什至在 .h 文件中添加了包含保护,这样就不会与 str 发生冲突,但似乎不起作用。怎么了?

4

2 回答 2

6

就像任何其他全局变量一样,在需要使用它的任何地方声明它并只在一个地方定义它。所以在 中foo.h,将其标记为extern。然后在foo.cpp.

于 2012-09-02T21:43:42.487 回答
3

include 指令将包含文件的内容逐字包含到包含#include. 因此,您最终得到了两个 cpp 文件中的定义char str[ 20 ];因此两次。

extern char str[ 20 ];

在头文件中并放入

char str [ 20 ];

只放入其中一个 cpp 文件中。

于 2012-09-02T21:46:25.180 回答