3

Utility 名前空間で定義するグローバル変数があります。このユーティリティはいくつかのファイルに含まれており、次のようになっています。

#ifndef _UT_
#define _UT_
namespace UT {
  std::string PLATFORM_LINUX_NAME = "linux";
  std::string  PLATFORM_MACOSX_NAME = "macosx";
  std::string  PLATFORM_WINDOWS_NAME = "windows";
  #if defined(OS_WIN)
    int PLATFORM = OSTYPE::PLATFORM_WINDOWS;
  #elif defined(OS_LINUX)
    int PLATFORM = PLATFORM_LINUX;
  #elif defined(OS_APPLE)
    int PLATFORM = PLATFORM_MACOSX;
  #endif
};

このファイルをたとえばファイル Ah、Bh、Ch に含めると、次のようなコンパイラ警告が表示されます。

warning LNK4006: "int UT::PLATFORM" (?PLATFORM@UT@@3HA) already defined in A.obj; second definition ignored
warning LNK4006: "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > UT::PLATFORM_LINUX_NAME" (?PLATFORM_LINUX_NAME@UT@@3V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@A) already defined in A.obj; second definition ignored

これを解決するためのクラスを作成しない最善の方法は何ですか? それとも、UT クラスを作成することが唯一の方法ですか?

4

3 に答える 3

9

変数を 1 つのファイルで定義し、.cppそのファイルで宣言し.hます。でUT.h

namespace UT
{
    extern const std::string PLATFORM_LINUX_NAME;
    extern const std::string PLATFORM_MACOS_NAME;
    extern const std::string PLATFORM_WINDOWS_NAME;
    extern const int PLATFORM;
}

UT.cpp:

namespace UT
{
    const std::string PLATFORM_LINUX_NAME   = "linux";
    const std::string PLATFORM_MACOS_NAME   = "macosx";
    const std::string PLATFORM_WINDOWS_NAME = "windows";

    #if defined(OS_WIN)
    const int PLATFORM = OSTYPE::PLATFORM_WINDOWS;
    #elif defined(OS_LINUX)
    const int PLATFORM = PLATFORM_LINUX;
    #elif defined(OS_APPLE)
    const int PLATFORM = PLATFORM_MACOSX;
    #endif


}

constこれらは定数値のように見えるため、修飾子を追加しました。

于 2012-07-02T12:43:16.717 に答える
1

1 つの解決策は、それらをすべて静的にすることです。この場合、各オブジェクト ファイルは独自のコピーを取得します。もう 1 つの可能性は、宣言をヘッダーに入れるだけで、定義を別のファイルに入れることです。

于 2012-07-02T12:43:29.473 に答える
0

試す

#ifndef _INCL_GUARD
#define _INCL_GUARD

std::string PLATFORM_LINUX_NAME     = "linux";
std::string  PLATFORM_MACOSX_NAME   = "macosx";
std::string  PLATFORM_WINDOWS_NAME  = "windows";



#if defined(OS_WIN)
    int PLATFORM = OSTYPE::PLATFORM_WINDOWS;
#elif defined(OS_LINUX)
    int PLATFORM = PLATFORM_LINUX;
#elif defined(OS_APPLE)
    int PLATFORM = PLATFORM_MACOSX;
#endif

#endif
于 2012-07-02T12:47:20.243 に答える