C 에서 C++ 함수 호출
C와 C++ 코드들이 혼재된 프로젝트에서 C++ 에서 정의된 함수를 C 에서 호출하는 방법.
C++ 측에 C에 노출시킬 함수에 extern "C" 선언 추가된것은 C에서 호출가능함.
/// C++ mycpp.cpp 측 코드.
void function(void)
{
}
//상기 함수를 C측에 노출시키는 함수 추가 작성.
extern "C" void c_function(void)
{
function();
}
// C++측 헤더 파일 mycpp.h 에는 위 함수 선언 추가하지 않는다.
// extern "C" void c_function(void); <- 이것 기록하면 안됨.
//////////////////////////////
// C측에서 C++ 에서 extern "C" 로 노출시킨 함수 호출.
c_function(); // C++ 측에서 extern "C" 로 선언된 것 호출가능.
C/C++ 에서 함수 정의시 명시하지 않아도 기본 extern 형식이며 해당 함수의 scope은 해당 파일외부에서도 접근가능하다.
해당 파일에서만 접근가능하게 제한하려면 함수 정의에 static 추가한다.
C++ 에서 함수 정의시 extern 명시 하지 않아도 기본 extern 으로 처리되는데 실제 정확한 의미는 extern "C++" 이다. 즉 C++ 규약의 naming mangling 한다는 의미. C에서는 접근불가함.
extern "C" 로 함수정의하면 C 에서도 접근가능하게 됨.
C 에서 C++ 클래스 멤버 함수 호출
C++ 코드에서 아래 코드에서 처럼 클래스 멤버 함수 노출 시켜주는 함수 정의한다.
C++ 측 코드에 함수 인자로 클래스 포인터 my_class * 가 있는데, C 코드에서 class 를 모른다. C 코드 에서는 구조체 포인터로 형 지정하여 선언하고 있다.
/////////// C++ code
class my_class{
double f1(int _i);
};
// C 코드에서 상기 클래스의 멤버함수 f1 호출할 수 있게 함.
extern "C" double call_my_class_f1(my_class * _p_my_class, int _i)
{
return _p_my_class->f1(_i);
}
/////////// C code
double call_my_class_f1(struct my_class * _p_my_class, int _i); // struct
void ccc(struct my_class * _p_my_class, int _i)
{
double retv = call_my_class_f1(_p_my_class, _i);
}
C++ 에서 C 함수 호출.
C++ 측에서 호출할 C 함수 선언시 extern "C" 로 감싼다.
// C++ 에서 C함수 호출.
// C 함수 여러 개 .
extern "C" {
void func1(void);
uint8_t func2(void);
}
// C 함수 1개 단위로
extern "C" void func1(void);
func1(); // C++ 에서 C 함수 호출.
C, C++ 혼재 코드 상세 정보
https://isocpp.org/wiki/faq/mixing-c-and-cpp
연관
첫 등록 : 2020.01.24
최종 수정 : 2023.07.11
단축 주소 : https://igotit.tistory.com/2452
'VisualStudio.C++.C# > C . C++' 카테고리의 다른 글
C/C++. 윈도우. 파일 저장, 읽기 . FILE . fopen, fprintf, fscanf (0) | 2020.03.29 |
---|---|
C++ REST SDK. Json 형식 다루기 . (0) | 2020.03.22 |
C. C++. 메모리 직접 접근 (0) | 2020.01.20 |
C/C++. & 와 * 메모리 접근 형변환 (0) | 2020.01.13 |
C/C++. 구조체 변수 선언 동시 멤버 초기화 (0) | 2020.01.10 |
댓글