请在这里给我一个提示:

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

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

我将这两次包括在内并得到:



您可能会猜到,这个想法只定义了一次Platform。为什么#ifndef#define失败?我该如何解决?

最佳答案

#define是本地翻译单元,但定义不是。您需要在头文件中放入extern UIClass Platform;,在实现文件中放入UIClass Platform;

如果您确实想在 header 中包含定义,则可以使用一些模板类魔术:

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;

关于c++ - 为什么 “already defined”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20955287/

10-11 20:19