Post

Visual C++ C4503 Warning Fix

주의 사항

이 글은 예전 블로그에서 옮겨온 오래 된 글입니다. 현재 상황과는 다를 수 있으며, 잘못 된 정보가 있을 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <map>
 
using namespace std;
 
struct VeryLongClassNameType1
{
 
};
struct VeryLongClassNameType2
{
 
};
struct VeryLongClassNameType3
{
 
};
struct VeryLongClassNameType4
{
 
};
struct VeryLongClassNameType5
{
 
};
typedef map<VeryLongClassNameType1, VeryLongClassNameType2> LongNameStdMap;
typedef map<VeryLongClassNameType3, LongNameStdMap> LongNameStdMap2;
typedef map<VeryLongClassNameType4, LongNameStdMap2> LongNameStdMap3;
typedef map<VeryLongClassNameType5, LongNameStdMap3> LongNameStdMap4;
 
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 하는 해결책을 제시 하고 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
typedef map<VeryLongClassNameType1, VeryLongClassNameType2> LongNameStdMap;
typedef map<VeryLongClassNameType3, LongNameStdMap> _LongNameStdMap2;
struct LongNameStdMap2
{
	_LongNameStdMap2 Element;
};
typedef map<VeryLongClassNameType4, LongNameStdMap2> LongNameStdMap3;
typedef map<VeryLongClassNameType5, LongNameStdMap3> LongNameStdMap4;
struct NewClass
{
	LongNameStdMap4 Element;
};

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

이럴때는

1
2
3
4
5
6
7
8
9
10
11
12
typedef map<VeryLongClassNameType1, VeryLongClassNameType2> LongNameStdMap;
typedef map<VeryLongClassNameType3, LongNameStdMap> _LongNameStdMap2;
class LongNameStdMap2 : _LongNameStdMap2
{
 
};
typedef map<VeryLongClassNameType4, LongNameStdMap2> LongNameStdMap3;
typedef map<VeryLongClassNameType5, LongNameStdMap3> LongNameStdMap4;
class NewClass : LongNameStdMap4
{
 
};

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

This post is licensed under CC BY 4.0 by the author.