2011-01-20 8 views
2

私たちのC++コードをVS2008からVS2010に移行する際に問題が発生しました。私はそれまでの理由で説明を見つけることができず、あなたの助けに感謝します。VS2008からVS 2010への移行 - 急変?

私たちはカスタムメモリアロケータを持っていて、それはdllにあります。残りのコードでは、プリプロセッサを使用して割り当てを関数にリダイレクトします。シンプルコードはVS2008では正しくコンパイルされますが、VS2010ではコンパイルされません。 stdafh.hで

:VS2010で

#define free my_free 
#include <string> 

私が取得:

1>d:\program files\microsoft visual studio 10.0\vc\include\xdebug(62): error C3861: 'free': identifier not found 

がラインから:

template<class _Ty> 
    void __CLRCALL_OR_CDECL _DebugHeapDelete(_Ty *_Ptr) 
    { // delete from the debug CRT heap even if operator delete exists 
    if (_Ptr != 0) 
     { // worth deleting 
     _Ptr->~_Ty(); 
     // delete as _NORMAL_BLOCK, not _CRT_BLOCK, since we might have 
     // facets allocated by normal new. 
     free(_Ptr); 

すべてのヘルプやアイデアが高く評価されます! C++ ISO標準によればモシェ

答えて

2

/Pオプションを使用してプリプロセッサフ​​ァイルを作成して調査したところ、問題の根本的な原因がわかりました。

#pragma push_macro("free") 
#undef free 

明らかにそれを再定義するために私たちの試みを打ち破る:

「マイクロソフトのデバッグヒープ・サポート・ヘッダ」としての地位を説明しXdebugをヘッダには、次の行が含まれています。だから、これはコンパイラには新しいものではなく、再定義しようとする関数で発生する普通の#undefだけです

+0

書く必要がありますので、STLの内容に影響を与えることはできませんように見えます。だから、文字列includeの後に#defineを置く。 –

6

、セクション17.4.3.1.1.2:

宣言またはそのヘッダに定義された名前を定義する任意のマクロを含んではならないヘッダを含む変換ユニット。そのような翻訳単位は、キーワードと語彙的に同じ名前のマクロを定義するものでもありません。

これは、ライブラリ関数名が他の意味を持つことは合法ではないことを意味します。#define私はこれがちょうどVS2008で動作するようになったと思います。しかし、VS2010に移行するとき、コンパイラの作者はこれが適切に動作しない実装を思いつきました。

freeの定義を再定義する場合は、デフォルトの動作を変更する独自のCライブラリの実装とコードをリンクすることで、より一般的なチャネルを使用することをお勧めします。

+0

これらの再定義は標準ヘッダーで常に確認できます。問題の私は私の発見を以下に述べました。とにかく、提案のおかげで、我々はおそらく別の今の –

関連する問題