3

inline namespaceMSVCでをエミュレートする方法はありますか?

LLVMのlibc++はこれを使用して、次のような非表示のバージョン管理された名前空間を作成します。

#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std {inline namespace _LIBCPP_NAMESPACE {
#define _LIBCPP_END_NAMESPACE_STD  } }
#define _VSTD std::_LIBCPP_NAMESPACE
namespace std {
  inline namespace _LIBCPP_NAMESPACE {
  }
}

そして、次のようにGCCでエミュレートします。

#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std { namespace _LIBCPP_NAMESPACE {
#define _LIBCPP_END_NAMESPACE_STD  } }
#define _VSTD std::_LIBCPP_NAMESPACE

namespace std {
namespace _LIBCPP_NAMESPACE {
}
using namespace _LIBCPP_NAMESPACE __attribute__((__strong__));
}

今私の質問は、MSVCで同じことをどのように達成するのですか?それが不可能な場合は、バージョン管理を省略したソリューションに満足します(今のところ)。

#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std {
#define _LIBCPP_END_NAMESPACE_STD }
#define _VSTD std

しかし、ある種の目的を打ち負かします...

4

1 に答える 1

8

そのようなエミュレーションの可能性はないのではないかと思います。Microsoftは、コンパイラの新しいリビジョンごとに標準ライブラリのABIを破っていますが、シンボルのバージョン管理にはあまり関心がないようです。インライン名前空間機能の基礎は強力な使用であったため、GCCエミュレーションは機能します。Microsoftにはこれほど似たようなものはなかったので、インライン名前空間をエミュレートすることはできません。今のところ、libc++のバージョン管理を行わないことに悩まされていると思います。

Microsoftのコンパイラには役立つ機能が1つあります。これは#pragmadetect_mismatchです:http: //msdn.microsoft.com/en-us/library/ee956429.aspx

基本的に、あなたは置きます

#pragma detect_mismatch("libcxx_version", "1.0")

中央のlibc++ヘッダーファイルに挿入され、そのファイルを含むすべてのモジュールには、キーと値を含むレコードが配置されます。Microsoftリンカは、モジュールをリンクするときに、そのようなすべてのレコードが任意の名前に対して同じ値を持っていることを確認し、不一致がある場合は文句を言います。

その結果、1つのプログラムに複数の並列バージョンのlibc ++を含めることはできませんが、少なくとも、実行時に厄介なクラッシュを引き起こす互換性のないオブジェクトファイルをリンクすることでサイレント破損が発生することはありません。

編集:言及するのを忘れました:この機能はVS2010の新機能ですが、右辺値refを使用せずにlibc ++をコンパイラーに移植することは、とにかく絶望的です。

于 2011-10-17T14:05:01.463 に答える