티스토리 뷰
이번 포스팅에서는 C 에서 C++ 클래스의 함수를 호출해보려고 한다.
기존의 Calculator 라는 Class가 있다고 해보자.
Calculator.h 에서는아래와 같이 Calculator struct 를 정의했다.
struct Calculator {
public:
Calculator();
static Calculator& getInstance();
int add(int a, int b, int * sum);
int minus(int a, int b);
int getSum();
int getMinus();
private:
int mSum;
int mMinus;
};
Calculator.cpp 는 아래와 같이 구현했다.
getInstance() 함수는 static 으로 선언하여 Calculator instance를 반환하도록 구현하였는데, static 으로 정의된 gCalculator 객체를 반환한다.
static 객체는 선언함과 동시에 생성자가 호출된다.
(이때 static 객체를 Calculator* 와 같이 포인터로 선언하면 new 연산자로 객체 생성을 해야한다.)
add 함수는 a, b 인자를 받아 합을 반환하고 세번째 인자 sum 으로도 전달할수 있도록 한다.
minus 함수는 인자 a에서 b를 뺀 값을 반환하며 getSum() 과 getMinus()는 마지막 결과값을 반환하도록 하였다.
#include "Calculator.h"
#include <iostream>
static Calculator gCalculator;
Calculator::Calculator() {
std::cout << "Calculator construction " << std::endl;
}
Calculator& Calculator::getInstance() {
return gCalculator;
}
int Calculator::add(int a, int b, int * sum) {
std::cout << "Calculator::add " << a + b << std::endl;
*sum = a + b;
mSum = a + b;
return a + b;
}
int Calculator::minus(int a, int b) {
std::cout << "Calculator::minus " << a - b << std::endl;
mMinus = a - b;
return a - b;
}
int Calculator::getSum() {
return mSum;
}
int Calculator::getMinus() {
return mMinus;
}
extern "C" {
int add(int a, int b, int *sum) {
std::cout << "add " << a << " + "<< b << std::endl;
return Calculator::getInstance().add(a, b, sum);
}
int minus(int a, int b) {
std::cout << "minus " << a << " - " << b << std::endl;
return Calculator::getInstance().minus(a, b);
}
int getSum() {
return Calculator::getInstance().getSum();
}
int getMinus() {
return Calculator::getInstance().getMinus();
}
}
extern "C" 내부의 함수는 C에서 호출될 함수들이다.
함수 앞에 extern "C"를 선언하면 C++ 컴파일러는 함수이름을 C언어 함수로 인식한다.
마지막으로 C에서 C++ 의 함수는 아래와 같이 구현된다.
#include <stdio.h>
int add(int a, int b, int *count);
int minus(int a, int b);
int getSum();
int getMinus();
int main(){
int sum;
printf("-----Calculator-----\n\n");
printf("add -> %d \n", add(5, 2, &sum));
printf("sum : %d \n", sum);
printf("getSum : %d \n\n", getSum());
printf("minus -> %d \n", minus(5, 2));
printf("getMinus : %d \n", getMinus());
return 0;
}
C++의 extern "C"로 선언된 사용할 함수들을 정의한 후 사용할 수 있다.
실행해본 결과이다.
'개발자이야기' 카테고리의 다른 글
c++ std::map 의 사용법 - map에 객체를 넣어보자 (0) | 2020.01.12 |
---|---|
GCC (C 컴파일러) 설치하기 (0) | 2020.01.04 |
댓글