본문 바로가기
VisualStudio.C++.C#/C . C++

C/C++. C 에서 C++ 함수 호출하기. extern "C" 선언. C++ 에서 C함수 호출.

by i.got.it 2020. 1. 24.

 

 

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

 

Standard C++

 

isocpp.org

 

 

연관

 

 

 

STM32CubeIDE . 임베디드 코드에서 C++ 클래스 활용

STM32 펌웨어 C++ 로 개발하기 STM32CubeIDE 에서 프로젝트에 적용할 컴파일러를 C 나 C++ 로 선택 가능하다. C++ 컴파일러로 선택하면 C++, C 컴파일도 같이 이뤄지는 것이고 C 컴파일러로 선택되어있다면

igotit.tistory.com

 

 

KEIL. 임베디드 프로젝트에서 C++ 활용

KEIL 에서는 C 뿐만 아니라 C++ 컴파일러도 포함되어있고, C와 C++ 혼재된 프로젝트 구성가능하며, KEIL 에서 특별한 설정을 하지 않고 현재 작업 중인 KEIL 프로젝트에서 확장자 cpp 인 C++ 소스파일 추가하면 해..

igotit.tistory.com

 

 

 

 

 

 


첫 등록 : 2020.01.24

최종 수정 : 2023.07.11

단축 주소 : https://igotit.tistory.com/2452


 

댓글



 

비트코인




암호화폐       외환/나스닥/골드       암호화폐/외환/나스닥/골드 암호화폐/외환/나스닥/골드   암호화폐/외환/나스닥/골드
     
현물 |선물 인버스 |선물 USDT       전략매니저(카피트레이딩)     롤오버 이자 없는 스왑프리계좌
( 스왑프리 암호화폐도 거래 가능 )    
MT4, MT5 , cTrader 모두 지원     FTMO 계좌 매매운용. MT4,MT5