2

나는 우리 가게를 VS2008sp1에서 VS2010으로 옮길 것을 고려하고있다. 나는 2008 년에 매우 만족해 왔지만 TR1을 우리 코드에서 사용하고 싶습니다.의견 : VS2010으로 전환 한 C++ 개발자는 누구입니까?


나는 2010 V의 동료 프로그래머의 게슈탈트에 정말 관심이 있어요. 2008, 오히려 다음 중 어느 하나 개의 요소에 솔루션을보다!


그러나, 나는 우리의 프로젝트를 & 솔루션을 변환하는 과정에있어, 나는이 IMO, 비율은 오히려 절름발이 "잡음이 신호를"것을 찾는거야. 지금까지 필자는 $ (TargetExt)와 같은 여러 가지 가짜 Microsoft 빌드 경고를 제거해야하는 모든 프로젝트를 다시 연결하는 방법을 찾고 있습니다. ...

이 메시지에는 몇 가지 변형이 있으며 프로젝트마다 여러 가지가 있으며 약 75 개의 프로젝트가 있습니다. 필자는이 프로젝트 출력 타겟을 모두 다시 써서 시간을 낭비하지 않으려한다. (명백하게 MSBuild는 링커의 타겟과 컴파일러의 타겟이 동일해야하며, 필자에게 필요하거나 바람직하지 않다).

또한 [당혹감], 우리는 여전히 VSS를 사용합니다. 그리고 MSBuild 준수 프로젝트에 대한 마사지를 시도하면서 처음으로 VS2010의 VSS 인터페이스가 2008 년 1/4 정도 빠르다는 것을 알았습니다. 그것은 끔찍한 일입니다. 일반적으로 VSS의 성능).

한숨 ... 나는 "답장"중 약 1/2 이상이 "VSS 사용을 중지하십시오."라고 알고 있습니다. 그래, 좋은 생각이야. 먼 미래에 전복으로 옮겨 갈지도 모른다. 하지만 한 번에 한 가지. 이는 MSBuild 문제 나 새로운 C++ 문제가 아닌 VSS 속도 문제 만 해결합니다.

새로운 표준 라이브러리와 TR1 자료가 일부 코드를 손상시킨 것 같습니다. 그 자체로 충격적이지는 않습니다. 사실이 아니라면 나는 놀랐을 것입니다. 하지만 그 오류 메시지는 LOOOONNNNNGGGG입니다. STL을 사용하고 오류 메시지가 다소 복잡해 지도록 상위 문자열 이름을 추론 한 오류 문자열 파서 도우미를로드해야하는 초기의 날을 생각 나게합니다. 유능한. 10 년이 지난 지금, 나는 진단이 너무 깊고 복잡하여 다시는 이해가되지 않는다는 것을 알게되었고, 실제 문제가 무엇인지 전혀 알지 못합니다. 한 경우에는 내가 multimap은에 새로운 요소를 삽입하려고 해요 :

typedef CCimexDataSource::CategoryID      CategoryID; 
typedef std::multimap<CString, CCimexDataSource *>   description_sources_multimap; 
typedef std::map<CategoryID, description_sources_multimap> category_sources_map; 
// attempt to insert a new description->CCimexDataSource* keyed by CategoryID (an unsigned) 
m_category_sources_map[it->GetCategory()].insert(std::make_pair(it->GetDescription(), &(*it))); 

내가 얻을 :

1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility(163): error C2440: 'initializing' : cannot convert from 'const CCimexDataSource *' to 'CCimexDataSource *' 
1>   Conversion loses qualifiers 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility(255) : see reference to function template instantiation 'std::_Pair_base<_Ty1,_Ty2>::_Pair_base<_Ty,const CCimexDataSource>(_Other1 &&,_Other2 &&)' being compiled 
1>   with 
1>   [ 
1>    _Ty1=const CString, 
1>    _Ty2=CCimexDataSource *, 
1>    _Ty=ATL::CStringT<char,StrTraitMFC<char>>, 
1>    _Other1=ATL::CStringT<char,StrTraitMFC<char>>, 
1>    _Other2=const CCimexDataSource * 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\xmemory(208) : see reference to function template instantiation 'std::pair<_Ty1,_Ty2>::pair<ATL::CStringT<BaseType,StringTraits>,const CCimexDataSource*>(std::pair<ATL::CStringT<BaseType,StringTraits>,const CCimexDataSource *> &&)' being compiled 
1>   with 
1>   [ 
1>    _Ty1=const CString, 
1>    _Ty2=CCimexDataSource *, 
1>    BaseType=char, 
1>    StringTraits=StrTraitMFC<char> 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\xmemory(280) : see reference to function template instantiation 'void std::allocator<_Ty>::construct<std::pair<_Ty1,_Ty2>>(std::pair<const _Kty,CCimexDataSource> *,_Other &&)' being compiled 
1>   with 
1>   [ 
1>    _Ty=std::pair<const CString,CCimexDataSource *>, 
1>    _Ty1=ATL::CStringT<char,StrTraitMFC<char>>, 
1>    _Ty2=const CCimexDataSource *, 
1>    _Kty=CString, 
1>    _Other=std::pair<ATL::CStringT<char,StrTraitMFC<char>>,const CCimexDataSource *> 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\xtree(592) : see reference to function template instantiation 'void std::_Cons_val<std::allocator<_Ty>,_Ty,std::pair<_Ty1,_Ty2>>(_Alloc &,std::pair<const _Kty,CCimexDataSource> *,std::pair<_Ty1,_Ty2> &&)' being compiled 
1>   with 
1>   [ 
1>    _Ty=std::pair<const CString,CCimexDataSource *>, 
1>    _Ty1=ATL::CStringT<char,StrTraitMFC<char>>, 
1>    _Ty2=const CCimexDataSource *, 
1>    _Alloc=std::allocator<std::pair<const CString,CCimexDataSource *>>, 
1>    _Kty=CString 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\xtree(755) : see reference to function template instantiation 'std::_Tree_nod<_Traits>::_Node *std::_Tree_val<_Traits>::_Buynode<_Ty>(_Valty &&)' being compiled 
1>   with 
1>   [ 
1>    _Traits=std::_Tmap_traits<CString,CCimexDataSource *,std::less<CString>,std::allocator<std::pair<const CString,CCimexDataSource *>>,true>, 
1>    _Ty=std::pair<ATL::CStringT<char,StrTraitMFC<char>>,const CCimexDataSource *>, 
1>    _Valty=std::pair<ATL::CStringT<char,StrTraitMFC<char>>,const CCimexDataSource *> 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\map(364) : see reference to function template instantiation 'std::pair<_Ty1,_Ty2> std::_Tree<_Traits>::insert<_Ty>(_Valty &&)' being compiled 
1>   with 
1>   [ 
1>    _Ty1=std::_Tree_iterator<std::_Tree_val<std::_Tmap_traits<CString,CCimexDataSource *,std::less<CString>,std::allocator<std::pair<const CString,CCimexDataSource *>>,true>>>, 
1>    _Ty2=bool, 
1>    _Traits=std::_Tmap_traits<CString,CCimexDataSource *,std::less<CString>,std::allocator<std::pair<const CString,CCimexDataSource *>>,true>, 
1>    _Ty=std::pair<ATL::CStringT<char,StrTraitMFC<char>>,const CCimexDataSource *>, 
1>    _Valty=std::pair<ATL::CStringT<char,StrTraitMFC<char>>,const CCimexDataSource *> 
1>   ] 
1>   c:\users\steve\projects\cimex cad-cam\14.0\cimex application\cimcad\formaddautomaticpage.h(17) : see reference to function template instantiation 'std::_Tree_iterator<_Mytree> std::multimap<_Kty,_Ty>::insert<std::pair<_Ty1,_Ty2>>(_Valty &&)' being compiled 
1>   with 
1>   [ 
1>    _Mytree=std::_Tree_val<std::_Tmap_traits<CString,CCimexDataSource *,std::less<CString>,std::allocator<std::pair<const CString,CCimexDataSource *>>,true>>, 
1>    _Kty=CString, 
1>    _Ty=CCimexDataSource *, 
1>    _Ty1=ATL::CStringT<char,StrTraitMFC<char>>, 
1>    _Ty2=const CCimexDataSource *, 
1>    _Valty=std::pair<ATL::CStringT<char,StrTraitMFC<char>>,const CCimexDataSource *> 
1>   ] 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility(163): error C2439: 'std::_Pair_base<_Ty1,_Ty2>::second' : member could not be initialized 
1>   with 
1>   [ 
1>    _Ty1=const CString, 
1>    _Ty2=CCimexDataSource * 
1>   ] 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility(167) : see declaration of 'std::_Pair_base<_Ty1,_Ty2>::second' 
1>   with 
1>   [ 
1>    _Ty1=const CString, 
1>    _Ty2=CCimexDataSource * 
1>   ] 

참고 : 위에서 <을 설정하는 방법 표준 :의 변화로 나타납니다 >는 iterators (1) 대신에 항상 const_iterators를 돌려 주도록 작동합니다. 그러나이 점은 내 질문에, 2008 그래서


에 비교되는 더 컴파일러 진단을 뒤얽힌 얼마의 예를 가지고 그냥 : 최근에 변환 한 그곳에 C에 대한 ++ 상점 : 당신은 후회 않는다 전환, 또는 그것을 감사? 어떻게 그렇게?

(1) Scott Meyer의 "Effective STL", (c) 2001, p95, item 22.

난 그냥이 다 퉜다 : 그것은 내가으로 실행했던 코드를 깨는 많은 변화를 다룹니다 http://blogs.msdn.com/b/vcblog/archive/2009/05/25/stl-breaking-changes-in-visual-studio-2010-beta-1.aspx?wa=wsignin1.0

+2

"나는 2008 년에 매우 만족해 왔지만 TR1을 코드에 사용하고 싶습니다." <- 2008 SP1은 TR1을 지원합니다 ... 또한 코드 상자에 오류 메시지를 게시하면 코드를 더 쉽게 추출 할 수 있습니다. –

+1

힌트 : 컴파일 오류를 디버깅 할 때 병렬 작성을 해제하십시오. 여러 빌드 프로세스의 라인을 인터리브하면 이미 혼란스러운 작업을 거의 불가능하게 만듭니다. 그런 다음 오류 메시지의 첫 번째 줄에 중점을 둡니다. 그 대답이 "예, 당신 (컴파일러)이 그렇게 할 수 없다는 것을 압니다. 왜 그렇게하려고합니까?" 컨텍스트 덤프를 살펴 보겠습니까? –

+0

이 경우 쓰기 가능한 'CCimexDataSource *'가 필요하지만 읽기 전용'const CCimexDataSource * '가 제공된다고합니다. 'it'는'const_iterator'의 일종입니까? –

답변

2

첫 번째 질문에 대답하기 : &(*it)의 종류는 아마 const CCimexDataSource *, 그리고 CCimexDataSource *입니다.

두 번째 토론 질문에 입력 : 우리는 VS2008에서 VS2010으로 변환했으며, VS2010이 더 느리지 만 잘 처리되었습니다. 인텔리 센스가 조금 더 있습니다. 변환이 완전히 자동으로 진행되지 않았으므로 나중에 vcxproj 파일을 수동으로 업데이트해야했습니다.

+0

예. 그것은 내가 제시 한 하나의 C++ 문제를 해결하지만, 2010 년에 대한 더 많은 통찰력을 기대하고 있습니다. 예를 들어 : set은 명시 적으로 my_set :: iterator를 사용하는 경우에도 모든 iterator를 const_iterator로 강제 변경했습니다. 그리고 진단은 제 의견으로는 지금까지는 2008 년보다 판독하기가 훨씬 쉽습니다. 이것은 가치있는 얕은 학습 곡선인가요? 아니면 빙산의 일각이며 소프트웨어가 규정을 준수하는 데 막대한 학습 곡선 및 변경이 필요할 것입니다. – Mordachai

+0

@Mordachai :'const' 참조로 컨테이너를 넘긴다면'mycontainer :: iterator'를 사용할 수 없습니다. 나는. 'const std :: vector :: begin()'은'iterator'가 아니라'const_iterator'를 반환합니다. –

+1

'set'에 저장되어있는 내부의 오브젝트를 수정하면 항상 세트 불변성이 깨졌습니다. 이전 값을 제거하고 새 값을 삽입하여 새 해시에서 찾을 수 있도록해야합니다. –

1

직장에서 문제없이 VS2005에서 VS2010으로 옮겼습니다. 그러나 가정용 컴퓨터에서 VS2010의 Intellisense 기능 중 상당수는 내 노트북에서 처리 능력을 많이 소모하므로 잠시 기다려야하기 때문에 한 번에 몇 개의 문자 만 입력하면됩니다. 데이터베이스를 업데이트하는 데 3 분이 걸립니다. Windows 7에서 상당히 새로운 컴퓨터 (최소 6GB RAM의 쿼드 코어 ~ 3GHz)에서 실행하는 경우 성능 문제가 거의 발생하지 않아야합니다. (집에있는 것처럼) XP에서 2GB RAM이 장착 된 Core2 Duo를 사용하면 IDE의 유용성을 위해 많은 기능을 해제해야합니다.

참고 : VS2008이 내 노트북에서 훌륭하게 실행되었습니다. 내가 "업그레이드"했을 때 나는 다소 실망했다.

+0

당신은 새롭고 강력한 노트북을 구입해야 할 수도 있습니다. –

+0

@Lemuel : 나는 동의한다, 그러나 나는 또한 그것을위한 자금을 정당화 할 수 없다. 동시에 새로운 고출력 데스크탑 (현재 건설 중이다)을 짓고있다. VS2010 (특히 익스프레스 에디션)을 XP (4GB 미만의 RAM으로 실행해야 함)에서 실행하는 것에 대한 불만이 많이 있습니다. Intellisense가 문제의 주요 원인입니다. 이 기능을 사용하지 않으면 VS2008에이 문제가 전혀 없었지만 제품을 사용할 수있게 만들었습니다. 따라서 실제 문제를 해결하기보다는 최신 소프트웨어를 실행하는 데 더 많은 해킹이 필요합니다. –

1

인텔리 센스로 가정용 PC (Core2Duo E6600, 2GB RAM)에 아무런 문제가 없습니다. 내가 싫어하는 유일한 점은 UI의 반응입니다. 그것은 매우 부진합니다.

나는 TR1과 C++ 0x의 개선이 느린 UI의 단점보다 더 중요하다고 생각합니다.

+0

성능 피드백에 대해 Zac & RedX에게 감사드립니다. – Mordachai

1

100 개 프로젝트로 솔루션 (VS2005)을 변환하고 프로젝트 파일을 업데이트하지 못한 후에도 컴파일을 시작하지 못해서 당분간 포기하기로 결정했습니다.

새로운 .net 프로젝트에 VS2010을 사용하면 IDE가 Eclipse와 조금 더 비슷하게 보이지만 마지막으로 클릭 한 뷰 부분에 코드 파일을 여는 것과 같은 기능을 계속합니다. 출력 또는 변수 창보기 .

MS 심볼 서버에 자주 문제가 생기면 MS 심볼 서버로 이동하는 디버그/모듈 기능이 문제를 해결하고 심볼 서버 목록을 망칠 필요가 없습니다.

관련 문제