C++

OverLoading , 컴파일 4단계,네임맹글링

Nin 2020. 12. 13. 02:53

C++ 에서는 함수는 특정 상황에서 이름이 겹치는것을 허용 한다.

void Func()
{
}

void Func(int Number)
{
}

int main()
{
   Func();
   Func(10);
}

둘의 함수명은 같지만 실행은 문제 없이 된다.(형태까지 완전히 같으면 불가능)

위의 코드에서 알수있듯이 인자값이 달라지면 함수명이 같더라도

컴파일러는 다른 함수라고 보는것이다.

이를 OverLoding 이라고 부른다.

 

컴파일 4단계 : 전처리기 -> 컴파일러 -> 어셈블러 -> 링커

 

전처리기 코드의 쓸모있는 부분만을 남긴다
컴파일러

코드의 쓸모있는 부분을 인간의 언어가 아닌 중간 언어로 바꾼다.
작성한 C++ 언어가 중간언어라고 하는 기계어가 되기 쉬운 언어로 바꾼다
중간언어로 바꾼 내용(cpp의 내용)들을 Obj라는 파일로 만든다.
대부분 header와 cpp로 나누니깐 선언부분과 구현부분이 분리된다.
함수들과 변수들은 대부분 우리가 작성한 이름을 버리고 다른 이름을 갖는다.

어셈블러 중간언어를 기계어로 변경
링커

완전히 바이너리로 바꾼다.       
컴파일러와 어셈블러에서 변형괸 선언과 구현부를 연결해서       
하나의 파일(보통 exe)로 바꾸게 된다.

 

컴파일러와 어셈블러에서 함수나 변수의 이름이

바뀌는 현상관 규칙을 네임맹글링 이라고 한다.

 

이 과정에서 Func() 함수의 이름과 Func(int Number) 함수의 이름이 같지 않기때문에

사용이 가능한것을 알 수 있다. 쉽게 생각하면 컴파일러는 Func()의 이름은 Func로

Func(int Number)의 이름은 Funcint 이런식으로 갖는다고 생각하면 된다.

이를 잘 생각해보면 함수의 이름이 같고 인자의 갯수도 같지만 인자의 자료형이 다르면

문제없이 실행된다는 것을 알 수 있다.

함수의 이름이 같고 함수의 리턴값이 다르다고 사용 가능하지 않다

->함수의 리턴값은 네임맹글링에 포함되지 않는다 !