C 언어와 C++ 언어 간의 “이름 망글링(Name Mangling)” 방식 차이

By | 2026년 6월 29일
Table of Contents

C 언어와 C++ 언어 간의 "이름 망글링(Name Mangling)" 방식 차이

이름 망글링(Name Mangling)

C++ 은 함수 오버로딩을 지원하기 위해, 컴파일시 함수명을 복잡한 함수명으로 변경한다.
C 는 본래 함수명 그대로를 유지한다.

C++ 코드에서 C 함수를 사용하게 되면 컴파일러는 복잡하게 변경된 함수명 목록에서 원래의 함수명을 찾으려 한다.
하지만 C 에는 그런 테이블이 없으므로 오류가 발생한다.

이것을 해결하기 위해 C++ 컴파일러에게 이 함수는 원래의 함수명을 그대로 유지한채 컴파일되었음을 알려주어야 한다.

해결책 : C++ 에서 C 함수 사용

// c++ 에서 처리

extern "C" {
    #include "myheader.h"
}

C 코드에서 처리해주는 것이 더 표준이라고 한다.
헤더에서 처리하면 한번으로 끝나지만, C++ 에서 처리하면 헤더를 인클루드 하는 모든 파일에 작업을 해야하기 때문이다.

#ifdef __cplusplus
extern "C" {
#endif

void my_function(unsigned int pin, _ACPI_VALUE_* value);

#ifdef __cplusplus
}
#endif

해결책 : C 에서 C++ 함수 사용

우선 C 는 함수 오버로딩이나 class 를 인식하지 못한다.
C++ 전용 문법을 사용한 경우 래퍼(Wrapper) 함수를 작성해야 한다.

// MyFunctions.h
#ifndef MY_FUNCTIONS_H
#define MY_FUNCTIONS_H

#ifdef __cplusplus
extern "C" {
#endif

// C에서 호출하고 싶은 C++ 함수 선언
void PrintMessage(int value);

#ifdef __cplusplus
}
#endif

#endif // MY_FUNCTIONS_H
// MyFunctions.cpp
#include <iostream>
#include "MyFunctions.h"

void PrintMessage(int value) {
    // 내부적으로는 C++의 기능을 마음껏 사용 가능
    std::cout << "[C++ Function] 라이브러리 내부에서 출력: " << value << std::endl;
}
// main.c
#include <stdio.h>
#include "MyFunctions.h" // 헤더 포함

int main() {
    printf("[C Main] C 프로그램 시작\n");

    // C++ 함수 호출
    PrintMessage(42); 

    return 0;
}

답글 남기기