Name Mangling
맹글링은 영단어로 '난도질하다'라는 의미이다. 즉, 네임 맹글링은 말 그대로 어떤 이름을 난도질해버리는 것이다.
C++의 식별자 이름은 컴파일러에 의해 C언어처럼 유일한 이름으로 변경된다. namespace의 구분에 의해 중복되는 식별자가 많아질 수 있으므로 이런 기능이 도입되었고, 덕분에 함수 다중 정의(Overloading)가 동작할 수 있게 되었다.
네임 맹글링은 링크 타임의 오류를 디버깅할 때 반드시 알아야 하는 부분이다.
#include <iostream>
using namespace std;
extern "C" void noManglingFunc() // 네임 맹글링을 시행하지 않음
{
cout << "no mangling" << endl;
}
void testFunc() // (?testFunc@@YAXXZ) // <- 실제 함수 주소
{
cout << "Global::testFunc()" << endl;
}
namespace Test // (?testFunc@Test@@YAXXZ) // <- 실제 함수 주소
{
void testFunc()
{
cout << "Test::testFunc()" << endl;
}
}
namespace MyData // (?testFunc@MyData@@YAXXZ) // <- 실제 함수 주소
{
void testFunc()
{
cout << "MyData::testFunc()" << endl;
}
}
int main()
{
noManglingFunc();
testFunc();
::testFunc();
Test::testFunc();
MyData::testFunc();
}
extern "C" 를 명시하면 식별자가 C언어의 식별자처럼 다뤄지게 되고, 네임 맹글링을 실시하지 않게 된다.
'C, C++' 카테고리의 다른 글
C++) C++ 스타일 C코드와 this 포인터의 정의 (0) | 2024.01.20 |
---|---|
C++) OOP에서 객체란 무엇인가 (0) | 2024.01.20 |
C++) Namespace (0) | 2024.01.20 |
C++) 함수 템플릿 (0) | 2024.01.20 |
C++) 함수 다중 정의(Overloading) (0) | 2024.01.20 |