출처: https://noel-embedded.tistory.com/1078
extern "C" 의미
extern "C" 의미는 안에 정의된 함수 혹은 헤더파일에 관해서는 맹글링하지 말라는 의미다. 맹글링은 C++에서 사용되는 용어로, C++ 컴파일러 단계에서 함수 혹은 변수이름을 기존과 크게 다르게 바
noel-embedded.tistory.com
extern "C" 의미는 안에 정의된 함수 혹은 헤더파일에 관해서는 맹글링하지 말라는 의미다.
맹글링은 C++에서 사용되는 용어로, C++ 컴파일러 단계에서 함수 혹은 변수이름을 기존과 크게 다르게 바꾸는 행위를 말한다. C++은 C와 다르게 클래스 속성을 이용해서 매개변수를 달리해서 함수 이름을 동일하게 사용할 수 있게 된다. 즉 다형성을 지원하기에 가능한 일이다. 따라서 C++ 컴파일러에서의 맹글링 작업은 불가분의 관계에 있다
[참고] https://stackoverflow.com/questions/44056461/difference-externc-vs-extern/44056776
extern "C"는 cpp 소스파일에서 c 소스를 가져다 쓸 때 필요하다. cpp 소스는 다형성을 지원하지만 c 소스는 함수의 유일성이 보장된다. 따라서 맹글링 작업을 거칠 필요가 없다. 하지만 extern "C"를 사용한다면 c는 함수 이름자체가 심볼이 되지만 맹글링을 거치기 때문에 컴파일러가 위치를 찾지 못하고 에러를 발생시킨다
/* test1.c */
#include <stdio.h>
void print(const char *msg) {
printf("msg: %s\n", msg);
return;
}
/* test2.cpp */
#include <iostream>
using namespace std;
extern "C" void print(const char *msg);
int main(void) {
print("hello world");
return 0;
}
$ gcc -c test1.c
$ g++ -c test2.cpp
$ g++ -o test test1.o test2.o
$ ./test
'C++' 카테고리의 다른 글
템플릿의 정의를 CPP에 쓸 수 없는 이유 (0) | 2024.07.25 |
---|---|
__declspec(dllexport) (0) | 2024.06.20 |
이동 연산(std::move, std::forward) (0) | 2024.05.17 |
HeapAlloc & HeapFree (0) | 2024.05.15 |
기본 클래스와 interface class (0) | 2024.05.01 |