将C ++ main方法移动到其自己的文件时编译器错误

时间:2012-09-02 21:40:05

标签: c++ g++ main

我这里有世界上最简单的节目。我想,你们中的一些人只需要花一点时间来弄清楚什么是错的。

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

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

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,那么编译就好了。如果我想将main方法保留在单独的文件中,该怎么办?正如你所看到的,我甚至在.h文件中添加了包含警戒,这样就不会与str发生冲突,但似乎没有工作。怎么了?

2 个答案:

答案 0 :(得分:6)

就像任何其他全局一样,无论何时需要使用它都要声明它并仅在一个地方定义它。因此,在foo.h中,将其标记为extern。然后在foo.cpp中定义它。

答案 1 :(得分:3)

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

extern char str[ 20 ];

在头文件中并放入

char str [ 20 ];

只有一个cpp文件。