ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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

    www.geeksforgeeks.org/extern-c-in-c/

    '개발 > 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

    댓글

Designed by Tistory.