1

ここでヒントを教えてください:

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

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

私はこれを2回含めて取得しています:

LNK2005 - .obj (MSVS13) で既に定義されているプラ​​ットフォーム。

ご想像のとおり、Platform を 1 回だけ定義するという考え方でした。なぜ失敗するのです#ifndefか?#defineこれを修正するにはどうすればよいですか?

4

1 に答える 1

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;
于 2014-01-06T17:09:44.577 に答える