본문 바로가기

etc..

c와 cpp 파일을 같이 컴파일할 때

c와 cpp는 당연히 내부 함수 호출 방식 등 여러가지가 다르므로
컴파일시 같이 컴파일 하기 위해서는 컴파일러에게 이건 c코드다. 이건 cpp코드다 알려줘야
컴파일러가 알아먹고 링킹시에 적절한 라이브러리와 링크를 한다.
어떻게 알려주느냐? extern "C" 를 cpp 코드에 써주면 컴파일 시에 컴파일러가 알아서 c코드에서 해당
라이브러리를 가져와서 링킹한다. 
 
검색해보니
 ----------------------------------------------------------

헤더파일에 프로토타입을 쓸때 다음과 같이 쓰면 된다.

extern "C" int printf.... 
extern "C" int sprintf.... 
extern "C" int vprintf.... 
extern "C" int fprintf.... 


근데 이거 귀찮지여.. 한두개면 몰라도 한 1000개쯤 되면 미칠 겁니다. 

다음과 같이 쓰면 됩니다. 

extern "C" 
{ 
    int printf... 
    int sprintf... 
     ... 
} 

근데 이렇게 소스를 수정해 버리면 C++ 컴파일러에서는 문제가 없지만.. 

C 컴파일러가 extern "C" 를 알아 듣지 못하니 다시 C 컴파일러로 컴파일하자면 이번엔 

C컴파일러가 불평을 합니다. 그래서 다음과 같이 씁니다. 

#ifdef __cplusplus 
extern "C" 
{ 
#endif 
    int printf... 
    int sprintf... 
     ... 
#ifdef __cplusplus 
} 
#endif 

__cplusplus는 모든 C++ 컴파일러가 내부적으로 가지고 있는 미리 정의된 define이져.. 

C 컴파일러는 없으니 #ifdef .. #endif 는 C 컴파일러로 컴파일할 때는 무시됩니다. 

이제 문제가 없지여. C나 C++이나 다 쓸 수 있습니다. 

보통 C++ 컴파일러들은 C 컴파일러를 같이 가지고 있습니다. 

.C 는 C 컴파일러로 컴파일하고.. .CPP는 C++ 컴파일러로 컴파일하져.