티스토리 뷰

이번 포스팅에서는 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"로 선언된 사용할 함수들을 정의한 후 사용할 수 있다.

실행해본 결과이다.

 

실행결과

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함