C와 C++ 함께 사용하기

기술노트 46551

아키텍처:

All

컴포넌트:

compiler

업데이트:

2021-05-11 오전 10:28

소개

C++ 프로젝트에서 C 함수를 호출하고 싶을 때,

대신에, C 프로젝트에서 C++ 함수를 호출하고 싶을 때가 있습니다.

본 기술 노트는 C와 C++를 함께 사용할 때 고려해야할 몇가지 사항을 나열하였습니다. 완전한 가이드가 아닌, 몇가지 일반적인 장애와 그 해결방안에 대해 강조하기 위한 시도라는 점에 유의하시기 바랍니다.

고려해야할 사항

1.

C-linkage를 사용할 때. extern "C" { // your function declarations} 를 헤더 파일에 넣습니다.

이는 C++ 및 C 헤더 파일 모두에 필요합니다:

  • C 함수에서 C++ 함수를 호출하기 위해.
  • C++ 메서드에서 C 함수를 호출하기 위해.

2.

C++ 는 강한 타입 검사 언어입니다. 예로 다음의 C 함수를 보시겠습니다:

void LCD_DisplayString(const uint8_t *text);

C에서 다음과 같이 호출할 수 있습니다:

LCD_DisplayString("RTOS START");

반면 C++에선, RTOS STARTuint8_t* (char* 로부터)로 형변환해 주어야 컴파일이 가능합니다. 형변환보다 좋은 예로 3을 확인하시기 바랍니다.

3.

C-인터페이스를 C++ 클래스들로 묶습니다. 예시로, 상기의 LCD_DisplayString 함수는 class LCD::DisplayString()로 묶을 수 있습니다.

 

C++ 오버로딩을 사용하여, char*uint8_t*간의 형변환은 LCD 클래스 메서드 방법 안에 숨길 수 있습니다:

void LCD::DisplayString(const char *text);
void LCD::DisplayString(const uint8_t *text);

 

즉, C++ 코드의 모든 곳에 캐스팅되지 않도록 할 수 있습니다.

4.

일부 영역에서, C++는 다른 작용을 가집니다. 예를 들어:

const int myglobal

..는 C++에선 전역변수가 아닙니다, C++ 전역상수는 static 연결을 가지므로, 예를 들어, 다음의 volatile 접근은 반드시 C++에서 실행되진 않습니다.

void access(void) {
   *((volatile uint8_t*)0x20000000);
}

 

반면 C에선, volatile 접근이 이루어 집니다. (C와 C++언어 사양은 객체가 void 문맥에 접근할 때 다릅니다) 문제를 피하기 위해, 순수한 C 코드는 C로 컴파일이 이루어 지도록 해야합니다. (예를 들어 .c 파일 확장자를 가지는 RTOS 혹은 BSP 코드). C++ 컴파일러는 상기의 코드에 대해 경고 메시지를 발생시키는 것에 주의하시기 바랍니다. 

"Warning[Pe174]: expression has no effect."

5.

만일 C++ 프로그램에서 C 코드를 사용하고 싶다면, 분리된 (라이브러리) 프로젝트에 C 코드를 빌드 하는 것을 고려하시기 바랍니다. 빠른 접근을 위해 C++ 프로젝트와 같은 워크스페이스에 C 프로젝트 (라이브러리)를 두십시오. C++ 프로젝트의 그룹에 C 코드를 넣을 때와 비교하여, 다음의 이점을 가지고 있습니다:

  • 컴파일러 옵션간 명확한 차이.
  • 응용프로그램 빌드시간 단축 (수정된 코드를 재빌드할 필요가 없음).

6.

C 라이브러리가 RTOS 라면, RTOS heap을 사용하기 위해 추가적인 어려움이 있습니다. (예를 들어 RTOS 시작방법 등) Technical Note 90383을 참고하세요. 종종 RTOS 벤더는 C++ 예제, 문서 및 코드를 제공하며 이 부분에 관한 도움을 줍니다. 다시 한번, RTOS 코드가 C로 작성되었다면, C로 컴파일 하여 이러한 문제를 피하세요.

추가 정보

아래의 캡처화면과 다음의 예제를 확인하세요. Example project for IAR Embedded Workbench for ARM.

Workspace "mixing" contains two projects


모든 제품 이름은 해당 소유자의 상표 또는 등록 상표입니다.

죄송하지만, 당사 사이트에서는 Internet Explorer를 지원하지 않습니다.보다 편안한 사이트를 위해 Chrome, Edge, Firefox 등과 같은 최신 브라우저를 사용해 주시길 부탁드립니다.