2011-01-20 2 views
2

C++ 코드를 VS2008에서 VS2010으로 마이그레이션 할 때 문제가 발생했습니다. 나는 지금까지 그 이유에 대한 설명을 찾을 수 없으며 당신의 도움에 감사 할 것입니다.VS2008에서 VS 2010으로 마이그레이션 - 급격한 변화?

우리는 사용자 지정 메모리 할당자를 가지고 있으며 dll에 있습니다. 나머지 코드에서는 전처리기를 사용하여 할당을 함수로 리디렉션합니다. Thie 다음의 간단한 코드는 VS2008에서 올바르게 컴파일되지만 VS2010에서는 올바르게 컴파일되지 않습니다. stdafh.h에서

:

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

이 라인에서 오는 : VS2010에서

#define free my_free 
#include <string> 

내가 얻을

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에 어떤 영향을 미칠 수없는 것처럼 보입니다. 그래서 #define을 문자열 include 다음에 넣으십시오. –

6

섹션 17.4.3.1.1.2 :

선언 또는 헤더에 정의 된 이름을 정의하는 모든 매크로를 포함하지 않는다 헤더를 포함하는 번역 단위 . 또한 그러한 번역 단위는 키워드와 어휘 적으로 동일한 이름을위한 매크로를 정의하지 않는다.

즉, #define은 다른 것을 의미하는 라이브러리 함수 이름이 적합하지 않습니다. VS2008에서이 작업이 수행 된 것 같지만 VS2010으로 마이그레이션 할 때 컴파일러 작성자가 제대로 작동하지 않는 구현을 생각해 냈습니다.

free의 정의를 재정의하려는 경우 기본 동작을 변경하는 C 라이브러리의 구현과 비교하여 코드를 연결함으로써보다 일반적인 채널을 통해이를 수행하는 것이 좋습니다.

+0

표준 헤더에서 이러한 재 정의가 항상 발생하는 것을 볼 수 있으므로 근본 원인이 아닐 수도 있습니다. 문제의 나는 나의 발견을 아래에 묘사했다. 어쨌든 제안을 주셔서 감사 드리며, 지금은 다르게 쓸 필요가 있습니다. –

관련 문제