에러가 발생했던 상황에서의 메시지를 봐야 겠지만,
에러가 발생했을 때 해당 이름을 컴파일러 내부에서 변환한 이름으로 보여주는 것에 해당할 것입니다.
컴파일러 내부에서 이름을 변환하는 것을 네임 맹글링(Name Mangling) 또는 데코레이티드 네임(Decorated Name)이라고 합니다.
CALC_DATA data1;
data1.operand1 = 10;
data1.operand2 = 20;
CALC_DATA data2;
data2.operand1 = 40;
data2.operand2 = 15;
이러한 코드가 있을 때 컴파일러는 내부에서 고유의 이름을 만듭니다. 이름을 만드는 형식은 컴파일러마다 다릅니다.
Visual Studio에서는 에러가 발생했을 때 보여주는 메시지에서 데코레이티드 네임을 보여주는 것 같습니다.
직접 확인하고자 한다면 시작 메뉴에서
VS 2017에 대한 개발자 명령 프롬프트를 실행하고
Unit 77의 해당 examplecalc에서 다음과 같이 명령 프롬프트에서 컴파일합니다.
cl /c /FAs calc.c main.c print.c
x86용 Microsoft (R) C/C++ 최적화 컴파일러 버전 19.14.26433
Copyright (c) Microsoft Corporation. All rights reserved.
calc.c
main.c
print.c
코드를 생성하고 있습니다...
다음 명령으로 심볼을 출력합니다.
dumpbin /symbols print.obj
그러면 예를 들어 ?로 시작하는 심볼을 볼 수 있습니다.
?_OptionsStorage@?1??__local_stdio_printf_options@@9@9
심볼을 풀어낸 이름은
undname ?_OptionsStorage@?1??__local_stdio_printf_options@@9@9
Microsoft (R) C++ Name Undecorator
Copyright (C) Microsoft Corporation. All rights reserved.
Undecoration of :- "?_OptionsStorage@?1??__local_stdio_printf_options@@9@9"
is :- "`__local_stdio_printf_options'::`2'::_OptionsStorage"
이런 식으로 undecorated name을 볼 수 있습니다.
네임 맹글링 부분은 대부분은 쓸 일이 없습니다. 사람이 알아보기 위한 것이 아닌 컴파일러 내부적으로 쓰기 위한 이름이기 때문입니다. 그래서 undname 같은 툴이 있습니다. undname은 사람이 알아볼 수 있는 이름으로 변환하는 프로그램입니다.
정상적인 코드를 작성하고 컴파일이 된다면 맹글링된 이름을 쓸 일은 없습니다.
char _CALC_DATA::int이만 CALC_DATA 구조체의 char나 int가 쓰인 부분에 문제가 있겠다 정도로만 생각하면 됩니다.