extern "C" 의미

2019. 10. 6. 22:41PL/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