반응형
안녕하세요 돼지왕왕돼지입니다.
JNI 에 대해 학습하면서 extern "C" 라는 녀석을 보게 되었습니다. 그래서 오늘은 extern "C" 가 뭐하는 녀석인지에 대해 알아보겠습니다.
extern "C" 넌 뭐 하는 녀석이냐?
컴파일러는 링커가 링킹작업을 하도록 합니다. 이 링킹에서는 함수들에 관련된 정보를 오브젝트 파일에 기록하여 상호 호출이 가능하도록 하며, 이러한 정보를 linkage 라고 합니다.
이 링킹작업은 C와 C++ 을 혼합하여 사용했을 때 문제가 생길 수 있습니다. C와 C++의 링킹방식이 다르기 때문입니다. 링킹작업을 할 때, 함수명, 변수명 등의 앞뒤에 _ 등의 추가적인 symbol 을 붙이거나, 추가정보를 덧붙여 표시하는데, 이런 추가작업의 방식이 다릅니다.
C는 함수의 이름이 유일하기 때문에 (overloading 미지원) 함수 앞에 _ 등의 심볼만을 붙이면 됩니다. 하지만 C++는 overloading 을 지원하기 때문에, 같은 이름의 함수가 여러개 있을 수 있고, 이에 따라 링킹시 추가적인 정보들을 넣어주어야 합니다. 이 추가정보를 mangled name 이라고 하며, 인자의 갯수, 데이터형에 대한 정보가 추가로 들어가는 것입니다.
결론적으로 C와 C++을 혼합하여 사용하는 프로그램에서는 링킹시 함수명을 각각의 방식으로 찾을 수 있도록 C인지, C++ 인지를 명시해주어야 합니다. 이 때 extern "C" 가 링킹에 대한 지시자 역할을 합니다. extern "C" 를 써주면, C 의 링킹 방식을 사용하라고 컴파일러에게 지시하는 것이죠.
반응형
'프로그래밍 놀이터 > C, C++, C#, VB' 카테고리의 다른 글
[Java 개발자가 공부해본 C#] CLR ( Common Language Runtime ) 에 대하여. (0) | 2012.04.15 |
---|---|
[Java 개발자가 공부해본 C#] C#에서 Exception 이 발생하면.. (2) | 2012.04.15 |
[Java 개발자가 공부해본 C#] HelloWorld. (4) | 2012.04.12 |
[Java 개발자가 공부해본 C#] C# 개발을 위한 프로그램. ( Visual Studio, Visual C# 2010 Express, Dream Spark 무료 다운 ) (0) | 2012.04.12 |
[Java 개발자가 공부해본 C#] 더 나은 세상을 위한 C# ( C#의 등장배경, C#은 왜 필요한가?, 닷넷은 무엇인가? ) (1) | 2012.04.12 |
댓글