2016.06.21 06:28

Visual C++ C4503 Warning Fix

Lyn
조회 수 4987 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
#include <map>
 
using namespace std;
 
struct VeryLongClassNameType1
{
 
};
struct VeryLongClassNameType2
{
 
};
struct VeryLongClassNameType3
{
 
};
struct VeryLongClassNameType4
{
 
};
struct VeryLongClassNameType5
{
 
};
typedef map<VeryLongClassNameType1VeryLongClassNameType2LongNameStdMap;
typedef map<VeryLongClassNameType3LongNameStdMapLongNameStdMap2;
typedef map<VeryLongClassNameType4LongNameStdMap2LongNameStdMap3;
typedef map<VeryLongClassNameType5LongNameStdMap3LongNameStdMap4;
 
int main()
{	
	LongNameStdMap4 a;
}

 

위와 같은 코드를 빌드 하면 컴파일과 실행엔 문제가 없지만 C4503 Waring 이 뜹니다.

이 Warning 은 http://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k(C4503)&rd=true 에서 보다 시피, type명이 너무 길어서 짤릴 수 있다는 경고인데, 이 경우 나중에 크래시 덤프 등을 얻어서 처리할때 type 이 매칭 되지 않을 우려가 있습니다. 사실 4098 라는 type 길이는 충분했... 어야 했는데 template 가 겹치고 겹치면서(주로 Map을 겹쳐서 tree 형태의 자료구조를 구성 할 경우겠지만 ....) 의도하지 않게 긴 type 명을 가지게 되어 버리는 경우가 있습니다.

 

이 경우 위의 MSDN 링크 에서는 아래와 같은 방식의 다른 클래스로 한번 Wrapping 하는 해결책을 제시 하고 있습니다.

typedef map<VeryLongClassNameType1VeryLongClassNameType2LongNameStdMap;
typedef map<VeryLongClassNameType3LongNameStdMap_LongNameStdMap2;
struct LongNameStdMap2
{
	_LongNameStdMap2 Element;
};
typedef map<VeryLongClassNameType4LongNameStdMap2LongNameStdMap3;
typedef map<VeryLongClassNameType5LongNameStdMap3LongNameStdMap4;
struct NewClass
{
	LongNameStdMap4 Element;
};

이 경우 map 에 대한 접근이 a.Element.find() 처럼 한단계가 더 들어가게 됩니다... 만약 이름이 그 이상으로 길어서 2~3번 더 중간에 이름을 끊어 줘야 하는 경우, a.Element.Element.find() 와 같은 상황이 발생합니다. warning 을 제거하기 위해 의도와 다른 불편한 사용 방법을 강요받게 되는거지요. 이건 좋은 방법이라고 할 수 없습니다.

 

이럴때는 

typedef map<VeryLongClassNameType1VeryLongClassNameType2LongNameStdMap;
typedef map<VeryLongClassNameType3LongNameStdMap_LongNameStdMap2;
class LongNameStdMap2 : _LongNameStdMap2
{
 
};
typedef map<VeryLongClassNameType4LongNameStdMap2LongNameStdMap3;
typedef map<VeryLongClassNameType5LongNameStdMap3LongNameStdMap4;
class NewClass : LongNameStdMap4
{
 
};

 

처럼 public 상속을 해버리면 간단합니다... 그럼 일반적으로 map을 쓰는것과 전혀 다르지 않는 방법으로 코딩하면서 워닝만을 제거 할 수 있습니다.

TAG •
?

List of Articles
번호 제목 글쓴이 날짜 조회 수
158 boost::interprocess::managed_shared_memory의 동작에 관하여 Lyn 2014.08.22 208790
157 VC++ 2013 을 사용 할 경우 실행환경을 정확히 확인해야할 경우가 있습니다. file Lyn 2014.10.08 190564
156 Web 솔루션의 빌드속드와 리로딩속도에 관한 비교 4 Lyn 2014.08.29 175968
155 VS2015 Preview가 출시 되었습니다. Lyn 2014.11.13 64734
154 C++ new 연산자의 진실 2 file Lyn 2009.08.19 58119
153 네... 오늘 그날입니다 그날 Lyn 2014.12.10 52503
152 Microsoft C++ MVP 리워드를 개봉 해 보았습니다. 3 file Lyn 2013.10.11 51201
151 IIS 의 Application Pool 실행 계정이 ApplicationPoolIdentity 로 되어있을 경우 폴더 권한 부여 방법 Lyn 2014.04.15 50434
150 Windows 용 Redis 설치하기 (from nuget) file Lyn 2014.11.12 47141
149 [Boost 살펴보기] 3. timer Lyn 2009.05.11 44362
148 [Boost 살펴보기] 8. Tokenizer file Lyn 2009.06.11 42944
147 사용중인 FireFox 플러그인. Lyn 2010.05.18 42515
146 [Boost 살펴보기] 7. String Algorithm2 Lyn 2009.05.20 42259
145 [Boost 살펴보기] 6. String Algorithm1 Lyn 2009.05.12 41820
144 [Boost 살펴보기] 5. lexical_cast file Lyn 2009.05.12 41534
143 Compare, Merge 툴 간의 비교. - 작성중 1 Lyn 2009.12.08 40994
142 [잡설]델파이 / C++ Builder 하는 사람들의 문제점. Lyn 2010.02.07 39797
141 Google C++ Coding Style - 번역중 Lyn 2010.03.28 39429
140 [개인자료] 윈도우 재설치 후 설치 하는 프로그램 Lyn 2010.01.03 39218
139 Delphi 2009 Generic 살펴보기 1 Lyn 2008.09.29 38993
Board Pagination Prev 1 2 3 4 5 6 7 ... 8 Next
/ 8