请在这里给我一个暗示:
class UIClass
{
public:
UIClass::UIClass();
};
#ifndef __PLATFORM__
#define __PLATFORM__
UIClass Platform;
#else
extern UIClass Platform;
#endif
我将这包括两次并获得:
LNK2005 - 已在.obj(MSVS13)中定义的平台。
你可以猜到,这个想法只是定义一次平台。为什么#ifndef
或#define
会失败?我该如何解决这个问题?
答案 0 :(得分:8)
#define
是翻译单位 - 本地,但定义不是。您需要在标题中添加extern UIClass Platform;
,在实现文件中添加UIClass Platform;
。
如果确实希望在标题中包含定义,则可以使用一些模板类魔术:
namespace detail {
// a template prevents multiple definitions
template<bool = true>
class def_once_platform {
static UIClass Platform;
};
// define instance
template<bool _> def_once_platform<_> def_once_platform<_>::Platform;
// force instantiation
template def_once_platform<> def_once_platform<>::Platform;
}
// get reference
UIClass& Platform = detail::def_once_platform<>::Platform;