1

次のコードは、Visual Studio を使用する Windows で正常にコンパイルされます。

class_handle(base *ptr) : ptr_m(ptr), name_m(typeid(base).raw_name()) { signature_m = CLASS_HANDLE_SIGNATURE; }

Linux で同じコードをコンパイルしようとすると、次のようになります。

error: ‘const class std::type_info’ has no member named ‘raw_name’

私が理解している限りでraw_nameは、Microsoft固有の実装です。Windows システムと Linux システムの両方でコンパイルできるようにコードを変更するにはどうすればよいですか?

EDIT1元のコードを変更したくないので、gcc でコンパイルするための回避策が必要です。それは可能ですか?

EDIT2#define raw_name nameトリックを行いますか?

4

3 に答える 3

0

これらを書きます:

// for variables:
template<typename T>
char const* GetRawName( T unused ) { ... }
// for types:
template<typename T>
char const* GetRawName() { ... }

#ifdefMicrosoftコンパイラで定義されていることがわかっているが、他のコンパイラでは定義されていないことがわかっているトークンのブロックを使用して、WindowsとWindows以外で異なる実装を使用します。これにより、MS でコンパイルされたバージョンと MS 以外でコンパイルされたバージョンの間の前処理の違いが、分離されたファイルに分離されます。

これには、元のコードに最小限の変更を加える必要がありますが、Microsoft コンパイラでコンパイルできる方法で行います。

于 2012-11-27T15:28:53.603 に答える
0

おそらくより安全#define typeidです:

class compat_typeinfo {
  const std::type_info &ti;
public:
  explicit compat_typeinfo(const std::type_info &ti): ti(ti) {}
  const char *name() const { return ti.name(); }
  const char *raw_name() const { return ti.name(); }
};
compat_typeinfo compat_typeid(const std::type_info &ti) {
  return compat_typeinfo(ti);
}
#define typeid(x) compat_typeid(typeid(x))

もちろん、これは 17.6.4.3.1p2 では違法です (翻訳単位は、キーワードと語彙的に同一であってはならない#define#undef[...] ) ですが、合理的に機能する可能性が高く、他の場所での変更は最小限で済みます。

于 2012-11-27T15:28:56.950 に答える