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;
}