为什么“已定义”?

时间:2014-01-06 17:07:44

标签: c++ c-preprocessor ifndef

请在这里给我一个暗示:

class UIClass
{
public:
    UIClass::UIClass();
};

#ifndef __PLATFORM__
#define __PLATFORM__
    UIClass Platform;
#else
    extern UIClass Platform;
#endif

我将这包括两次并获得:

  

LNK2005 - 已在.obj(MSVS13)中定义的平台。

你可以猜到,这个想法只是定义一次平台。为什么#ifndef#define会失败?我该如何解决这个问题?

1 个答案:

答案 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;