-
[Name mangling/Name decoration] 유일한 이름을 위해개발/C·C++ 2021. 4. 19. 15:57
extern "C" { extern "C++" { void func(); } }
Name mangling은 C++에만 있습니다. C++에서 Name mangling이 필요한 이유는 여러 namespace, module, class 등에서 사용된 같은 이름(함수, 변수 등)을 고유하게 만들어주기 위해서입니다. Name mangling 덕에 C++에서 함수 오버로딩도 가능한 것입니다. 링커가 오브젝트 파일들은 연결할 때 Name mangling을 통해 필요한 엔티티를 이어줍니다. 즉 Name mangling은 컴파일 단계에서 이루어집니다. 아래와 같은 함수 선언부가 있을 때,
int f (void) { return 1; } int f (int) { return 0; } void g (void) { int i = f(), j = f(0); }
C++ 컴파일러는 다음처럼 이름을 mangling합니다. 하나의 예시입니다. mangling 규칙은 표준이 없기 때문에 컴파일러마다 방식이 다릅니다.
int __f_v (void) { return 1; } int __f_i (int) { return 0; } void __g_v (void) { int i = __f_v(), j = __f_i(0); }
C++ 컴파일러를 이용해 C의 모듈을 이용한다거나 할 때는 Name mangling이 필요 없습니다. 함수 이름이 mangling되는 걸 막아야 할 때 extern 키워드를 이용합니다. 함수의 mangling을 막을 수도 있습니다.
extern "C" { int f1(int); int f2(int); int f3(int); }; extern "C" { void p(int){ /* not mangled */ } };
extern 키워드가 중첩되게 선언된 경우에는 가장 안쪽에 있는 extern 키워ngling은 C++에만 있습니다. C++에서 Name mangling이 필요한 이유는 여러 namespace, module, class 등에서 사용된 같은 이름(함수, 변수 등)을 고유하게 만들어주기 위해서입니다. Name mangling 덕에 C++에서 함수 오버로딩도 가능한 것입니다. 링커가 오브젝트 파일들은 연결할 때 Name mangling을 통해 필요한 엔티티를 이어줍니다. 즉 Name mangling은 컴파일 단계에서 이루어집니다. 아래와 같은 함수 선언부가 있을 때,
int f (void) { return 1; } int f (int) { return 0; } void g (void) { int i = f(), j = f(0); }
C++ 컴파일러는 다음처럼 이름을 mangling합니다. 하나의 예시입니다. mangling 규칙은 표준이 없기 때문에 컴파일러마다 방식이 다릅니다.
int __f_v (void) { return 1; } int __f_i (int) { return 0; } void __g_v (void) { int i = __f_v(), j = __f_i(0); }
C++ 컴파일러를 이용해 C의 모듈을 이용한다거나 할 때는 Name mangling이 필요 없습니다. 함수 이름이 mangling되는 걸 막아야 할 때 extern 키워드를 이용합니다. 함수의 mangling을 막을 수도 있습니다.
extern "C" { int f1(int); int f2(int); int f3(int); }; extern "C" { void p(int){ /* not mangled */ } };
extern 키워드가 중첩되게 선언된 경우에는 가장 안쪽에 있는 extern 키워드가 유효합니다. 다음의 경우 C++ 시스템이 적용됩니다.
extern "C" { extern "C++" { void func(); } }
참고 링크>
www.ibm.com/docs/en/i/7.2?topic=linkage-name-mangling-c-only
'개발 > C·C++' 카테고리의 다른 글
객체 지향 개론 (0) 2021.04.21 [Build process] Three steps (0) 2021.04.19 디폴트 파라미터와 함수의 프로토타입 (0) 2021.04.17 참조(reference) 변수 (0) 2021.04.17 [Pointer] 배열과 포인터 (0) 2021.04.14