2011-01-20 61 views
2

將我們的C++代碼從VS2008遷移到VS2010時遇到問題。到目前爲止,我找不到解釋它的原因,並會感謝您的幫助。VS2008到VS 2010的遷移 - 一個突破性的變化?

我們有一個自定義內存分配器,它駐留在一個dll中。在其餘的代碼中,我們使用預處理器將分配重定向到我們的函數。以下簡單的代碼在VS2008中正確編譯,但不在VS2010中。

在stdafh.h:

#define free my_free 
#include <string> 

在VS2010我得到:

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); 

任何幫助或想法將不勝感激!

摩西

回答

2

經過一些使用/ P選項創建預處理器文件並研究它們的調查後,我發現問題的根本原因。

的Xdebug的頭,它自己描述爲「微軟的調試堆支持頭」,包含以下行:

#pragma push_macro("free") 
#undef free 

這顯然打敗我們試圖重新定義它。所以這對編譯器來說並不是什麼新東西,只是簡單的#undef恰好發生在我們嘗試重新定義的函數中

+0

,因此看起來您不會影響STL中的內容。因此,在包含字符串後加上#define。 – 2011-03-30 20:42:27

6

根據該C++ ISO標準,部分17.4.3.1.1.2:

一個翻譯單元包括標題不應包含定義聲明或在該標頭中定義的名稱任何宏。這樣的翻譯單位也不應該定義與關鍵字詞彙相同的名稱的宏。

這意味着它不是合法的#define庫函數名稱意味着別的東西。我想這只是在VS2008中正常工作,但是當遷移到VS2010時,編譯器作者提出了一個無法正常工作的實現。

如果您想重新定義free的功能,我建議您通過將代碼鏈接到您自己的C庫實現來更改默認行爲,通過更傳統的渠道來完成此操作。

+0

您可以在標準頭文件中看到所有這些重新定義,所以您猜測我們不是根本原因的問題。我在下面描述了我的發現。無論如何,感謝您的建議,我們現在可能需要以不同的方式寫入 – 2011-01-23 08:45:03