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

Compiler error when moving C++ main method to its own file

本文关键字:文件 错误 编译器 自己的 C++ 方法 移动      更新时间:2023-10-16

这里有世界上最简单的程序。我想你们中的一些人只需要一秒钟就能弄清楚出了什么问题。

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作为全局,所以需要保留它。如果我把我的主方法移到foo.cpp中,那么事情就会编译得很好。如果我想把主方法保留在一个单独的文件中,该怎么办?正如你所看到的,我甚至在.h文件中添加了include保护,这样就不会与str发生冲突,但似乎不起作用。怎么了?

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

include指令将包含文件的内容直接包含在包含#include的文件中。因此,您在这两个cpp文件中都得到了定义char str[ 20 ];,因此两次。

写入

extern char str[ 20 ];

在头文件中并放入

char str [ 20 ];

只放入一个cpp文件中。