프로그래밍/C++2013. 5. 11. 14:53

c에서 c++함수 호출 시에 역시 extern "c"를 사용하게 되는데, 우선 예를 보자.

 

// gcd.h

#ifdef __cplusplus

extern "C"

#endif

int gcd(int v1, int v2);

 

//gcd.cpp

#include <boost/math/common_factor.hpp>

#include "gcd.h"

extern "C" {

int gcd(int v1, int v2){

return boost::math:gcd(v1, v2);

}

}

 

//sample.c

#include <stdio.h>

#include "gcd.h"

int main()

{

printf("%d와 %d의 최대공약수는 %d(이)다.\n", 14, 35, gcd(14,35));

return 0;

}

 

(위의 예문은 "BINARY HACKS 해커가 전수하는 테크닉 100선, 진명조 옮김" page 74 ~ page 75에서 발췌한 내용이다.)

뭐 다 좋은데, C++에서 저렇게 extern "C"를 함수에 추가해 줄 수 있는 경우가 과연 많을까?  본인 경험상 라이브러리 함수로 받아 수정을 못하는 경우가 태반인데, 과연 저렇게 수정해서 쓸 수 있는 경우가 많을까 고민이다.

 

뭔가 잘못 알고 있는 건 아닐까? 누가 알면 알려줬으면 좋겠다.

Posted by code cat
프로그래밍/C++2013. 5. 11. 12:09

C++에서 C라이브러리 혹은 프로그램 링크시에 우리는 보통 다음과 같이 쓴다

 

extern "C" 함수리턴타입 함수이름(매개변수원형);

 

그런데 이걸 C에서 쓰듯 함수 콜 직전에 불러준다거나 하면(그리 추천하는 방법은 아니다)

 

'expected unqualified-id before string constant' 

 

라는 GR같은 에러가 난다.

이건 C++에서는 클래스 정의나 함수구현 부분에서 "C"코드를 허락하지 않기 때문이다.

 

Posted by code cat
프로그래밍/C++2013. 2. 2. 20:32

예를 들어 c에서 라이브러리로 제공되는 함수가 있다고 하면 c++에서 그냥 c 함수 부르듯이 하면 알 수 없는 link error를 뿜는다.  

어?   분명히 제대로 적었는데... 하고 헤매일텐데, 이것은 syntax error나 라이브러리 링크가 제대로 안되서 그런 것이 아니라, symbol 이름 안 맞아서 그렇다.  이럴 땐, c++ 에서

extern "C" 함수선언

이렇게 해주면 된다.

Posted by code cat