반응형

출처 : http://sungho0459.blog.me/40142019746






---------------------------------------------------------------------------------------------------------

 

extern "C"를 자주 쓰긴 하지만 정확한 내용을 몰라 'jimbo73.egloos.com/1486292'으로 부터 퍼온 상태로 수정한 내용입니다.

컴파일러는 링커가 링킹작업시 오브젝트간 함수 이용 및 위치를 파악할 수 있도록, 컴파일시 사용된 함수에 관련한 정보(linkage)를 오브젝트 파일에 기록합니다.

 

 

linkage란 컴파일 시 함수이름 앞 또는 뒤에 '_'(언더바)등의 심볼을 덧붙이는 것을 말하는 것으로, C와 C++은 컴파일시 오브젝트 파일에 함수명, 변수명등에 심볼을 기록하는 방식이 다르다.

 

C에서는 함수의 이름이 유일하기 때문에 (Overloading 지원하지 않음) 함수 앞에 '_'등의 심볼만을 붙이면 된다. 하지만 C++에선 overloading을 지원하기 때문에 같은 이름의 함수를 여러개 가질 수 있다. 그래서 함수를 구분하기 위해 함수이름만으로 구분할 수 없게 되고, 인자의 개수와 데이터형에 대한 정보까지 가지게 되어 linkage 정보가 서로 다르게 된다.

 

그러므로 C와 C++을 혼합하여 사용 시, 두 언어간의 linkage방식이 틀려 함수 이용에 문제가 발생할 수 있다.

 

C와 C++을 혼합하는 프로그램에서는 link시 함수명을 각각의 방식으로 찾을 수 있도록 C언어 부분인지, C++ 부분인지를 확실히 명시해 주어야하며, 이때 linkage에 대한 지시자 역활을 하는 extern "C"를 사용한다.

 

사용방법 예제

#ifdef __cplusplus

  extern "C"{

#endif

 

    int func1();

    int func2();

 

#ifdef__cplusplus

  }

#endif

< #ifdef __cplusplus 이 문구는 C++이라면 이라는 컴파일러 지시자(조건문)입니다. >

 

 

 

 

 

p.s 간단히 정리해주신 jimbo73님에게 감사의 글을 올립니다.

[출처] extern "C"|작성자 에몬

반응형

+ Recent posts