ПОЧЕМУ «уже определено»?

Пожалуйста, предложите мне подсказку здесь:

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

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

Я включаю это два раза и получаю:

LNK2005 — Платформа уже определена в .obj (MSVS13).

Как вы можете догадаться, идея состояла в том, чтобы определить платформу только один раз. Почему #ifndef или же #define потерпеть поражение? Как мне это исправить?

1

Решение

#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;
8

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]