해당 페이지에 나온 예제대로 코드를 작성하였는데,
operator에서 이상이 생겨서 설명을 보니
char _CALC_DATA::int 라고 나옵니다.
이게 무슨 의미인지 확인하고 싶습니다.
책이나 예제에는 그런 부분이 없습니다.
확장자가 .c가 맞는지요?
컴파일러는 내부적으로 이름을 자기만의 규칙으로 변환해서 사용합니다. Visual C++, GCC 등 컴파일러에 따라 다릅니다. 이건 제작자가 정합니다.
그러나 C 언어라면 내부 이름에 ::가 쓰이지 않습니다. 확장자가 .cpp이고 C++로 컴파일되고 있다는 뜻일 겁니다.
C 언어와 C++는 호환되지 않습니다.
컴파일러 내부에서 이름을 변경하는 규칙은
https://en.wikiversity.org/wiki/Visual_C%2B%2B_name_mangling
링크를 참고하세요.
소스파일 확장자는 모두 .c로 되어 있습니다.
헤더파일 확장자는 모두 .h로 되어 있는데요,
이럴 경우에는 어떤 것을 생각해볼 수 있나요?
에러가 발생했던 상황에서의 메시지를 봐야 겠지만,
에러가 발생했을 때 해당 이름을 컴파일러 내부에서 변환한 이름으로 보여주는 것에 해당할 것입니다.
컴파일러 내부에서 이름을 변환하는 것을 네임 맹글링(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가 쓰인 부분에 문제가 있겠다 정도로만 생각하면 됩니다.