2019. 10. 6. 22:41ㆍPL/C++
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
만일 extern "C"를 지운다면
#include <iostream>
using namespace std;
/*extern "C"*/ extern void print(const char *msg);
int main(void) {
print("hello world");
return 0;
}
print에 대한 심볼을 찾을 수 없다는 에러를 출력하게 된다
추가로 cpp 파일에서 stdio.h C 헤더파일을 사용할 수 있는 이유는 헤더파일을 잘 살펴보면 extern C 처리가 되어 있어서 cpp 소스파일에서도 맹글링 작업이 진행되지 않게 된다
/* test4.cpp */
#include <stdio.h>
int main(void) {
printf("hello world\n");
return 0;
}
[참고] http://www.debugme.co.kr/2017/12/extern-c.html , https://embedded1.tistory.com/entry/extern-c , http://hyacinth.byus.net/moniwiki/wiki.php/C%2B%2B/extern%20%22C%22%20%EB%A5%BC%20%EC%93%B0%EB%8A%94%20%EC%9D%B4%EC%9C%A0
'PL > C++' 카테고리의 다른 글
temp 변수 없이 swap 하기 (0) | 2019.10.16 |
---|---|
C6011: NULL 포인터 'var'을 역참조하고 있습니다 에러 해결 (0) | 2019.10.12 |
윈도우에서 MySQL 원격 연결 (0) | 2019.09.09 |
AI, 네트워크 오목 프로그램 (0) | 2019.09.07 |
C# 스레드 안에서 타이머 동작시키기 (0) | 2019.09.05 |