C++链接错误与命名空间和包含文件

Jos*_*Pla 1 c++ c++11

我正在研究我的引擎的核心,我在Microsoft Visual c ++ express中遇到了严重的链接问题.

为了简化问题,导致问题的是这两个头文件,每个头文件都有一个具有不同标识符的命名空间.这两个文件实际上包含了彼此.编译时没有错误,但是在链接时,错误显示"X已在A.obj中定义".下面提供了一个示例:

HEADER 1

#ifndef HEADER1_H
#define HEADER1_H

#include "header2.h"
namespace Core{
    int x, y, z;
}
#endif
Run Code Online (Sandbox Code Playgroud)

HEADER 2

#ifndef HEADER2_H
#define HEADER2_H

#include "header1.h"
namespace GUI{
    int x, y, z;
}
#endif
Run Code Online (Sandbox Code Playgroud)

最终发生的是我得到一个错误,指出x,y和z变量已经在创建的第一个.obj文件中定义.我假设因为变量来自不同的命名空间,所以它们不会发生碰撞.我也有标题保护,因此头文件似乎不会被多次包含.

无论如何,任何形式的帮助或建议将不胜感激.我被困在这3天左右:P.另外,如果我没有提供足够的信息,请告诉我,这只是我目前的代码非常长.

干杯,乔伊

Jos*_*zer 9

实际上,问题是变量是在头文件中定义的 - 不是头文件包含的,是包含头的每个.cpp文件中的变量,所有6个变量都被定义.

每个.cpp文件都变成一个.o文件,每个.o都以定义的变量结束,这会导致链接器错误.你想要做的是在标题中使用extern关键字,它告诉编译器实际变量是在别处定义的......

例如:

namespace Core{
    extern int x, y, z;
}
Run Code Online (Sandbox Code Playgroud)

namespace GUI{
    extern int x, y, z;
}
Run Code Online (Sandbox Code Playgroud)

然后,在一个cpp文件中(只在一个cpp文件中!)你需要定义没有 extern 的变量

namespace Core {
    int x, y, z;
}
namespace GUI{
    int x, y, z;
}
Run Code Online (Sandbox Code Playgroud)

这将修复您的链接器错误.