2014-11-07 4 views
7

Swift 파일에서 C++ 함수 (클래스가 관련되지 않음)를 어떻게 호출해야합니까?Swift에서 C++ 함수 호출

someCFunction.c 에서 :

void someCFunction() { 
    printf("Inside the C function\n"); 
} 

void aWrapper() { 
    someCplusplusFunction(); 
} 

someCpluplusfunction.cpp에서 :

void someCplusplusFunction() { 
    printf("Inside the C++ function"); 
} 

main.swift 에서 :

someCFunction(); 
aWrapper(); 
나는이 시도 브리징-header.h가에서

는 :

#import "someCFunction.h" 
#import "someCplusplusFunction.h" 

나는 this answer는 매우 유익한 발견,하지만 여전히 나는 그것이 작동 할 수 없습니다. 올바른 방향으로 나를 가리켜 줄 수 있습니까?

감사합니다.

답변

8

헤더의 모양은 무엇입니까? '이 유효한 C 코드는, 그래서 아니라고

// cHeader.h 

extern "C" { 
    void someCplusplusFunction(); 
    void someCFunction(); 
    void aWrapper(); 
} 

참고 : 명시 적으로 C++에서 C 호환 기능을위한 연결 유형을 설정하려면

, 당신은 ++ 그래서 컴파일러는 C를 알려줄 필요 사전 처리기 매크로에 extern "C" 선언을 래핑해야합니다.

OS X 및 iOS에서 C++ 소스를 컴파일 할 때 __BEGIN_DECLS__END_DECLS 코드를 C 코드로 링크 할 수 있으며 유효한 C 코드가되기 위해 다른 프리 프로세서 트릭을 사용하는 것에 대해 걱정할 필요가 없습니다.

// cHeader.h 

__BEGIN_DECLS 
void someCplusplusFunction(); 
void someCFunction(); 
void aWrapper(); 
__END_DECLS 

편집 : 같은 :

, 그것과 같을 것이다 ephemer가 언급 한 바와 같이, 다음과 같은 전처리 매크로를 사용할 수 있습니다

// cHeader.h 

#ifdef __cplusplus 
extern "C" { 
#endif 
void someCplusplusFunction(); 
void someCFunction(); 
void aWrapper(); 
#ifdef __cplusplus 
} 
#endif 
+0

감사합니다! 이 예제에서는 완벽하게 작동합니다. Xcode는 여전히 실제 프로젝트를 링크하고 싶지 않지만 조사를 계속할 것입니다. – popisar

+0

실제 프로젝트에 문제가 있음을 발견했습니다. C++ 함수에 인수로 문자열을 전달하려고합니다. 내가 읽은 바에 따르면, Swift ** String **은 자동으로 C ** const char \ ***에 캐스팅되어야하지만, 나는 뭔가를 놓치고 있다고 생각한다. – popisar

+0

만약 내가 설교 한 것을 코딩한다면 ... 내 코드에서 ** const char \ ***와 ** char \ ***을 섞었다. 재개하기 : @MaddTheSame이 좋은 답변을주었습니다. 추가 할 사항은 없지만 감사합니다 :-) – popisar