출처 : 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"|작성자 에몬
'프로그래밍(Programming) > c++, 11, 14 , 17, 20' 카테고리의 다른 글
PathFileExists(파일경로가 붙은 파일 이름) 파일이 존재하는지 여부 (0) | 2012.10.31 |
---|---|
확장열 (0) | 2012.10.31 |
class 클래스명 (전방선언) [출처] class 클래스명 (전방선언)|작성자 쿠벨린 (0) | 2012.10.31 |
스택 오버플로우 발생시 덤프 기록하기, 메모리 디버그 코드 (0) | 2012.10.31 |
visual studio 2010 변화된 것들. pdf (0) | 2012.10.31 |