我知道有类似的问题,但没有一个解决这个问题。我想创建一个globals结构并使用默认值初始化它。我实现如下,但项目不会构建。
我已经尝试了我能想到的一切,最值得注意的是将*gxg
的“extern”声明移入和移出标题保护并将结构更改为类,但得到相同的结果:项目因为globals构造函数的重复符号而不会构建。如果我不在多个.cpp文件中使用它,或者如果我在struct的实现文件中没有包含构造函数或析构函数,那么它会构建。
// globals.hpp
#ifndef globals_hpp
#define globals_hpp
struct gxGlobals{
double radius;
bool easement;
gxGlobals(); // constructor
} ;
extern "C" gxGlobals *gxg;
#endif /* globals_hpp */
—————————————
// globals.cpp
#include "globals.hpp"
gxGlobals::gxGlobals():
radius(24),
easement(false)
{};
———————————
// main_file.cpp
#include "globals.hpp"
gxGlobals *gxg = new gxGlobals();
———————————
// other_file.cpp
#include "globals.hpp"
// ERROR: Duplicate symbol gxGlobals::gxGlobals()
我可以在一个文件中包含globals.h,但不能包含两个或更多文件。如果我删除.cpp文件中的自我初始化,它也可以工作。
实际结构中有太多成员使初始化列表变得切实可行,所以我的最后一个选项是一个在启动时运行的函数,它插入了所有默认值。我误以为这个应该工作?