c++ inline compile

cornpip
|2024. 4. 8. 23:36

클래스 정의에서 함수의 정의는 컴파일된 이후에 링커에 의해 하나의 실행파일로 묶이기만 하면 된다.

 

//Car.h
#ifndef __Car_h__
#define __Car_h__

class Car {
private:
	int fuelGauge;
public:
	void getFuelGauge();
	void setFuelGauge(int fuel);
};

#endif
//Car.cpp
#include "Car.h"
#include <iostream>

inline void Car::getFuelGauge() {
	printf("now fuel : %d", this->fuelGauge);
}

inline void Car::setFuelGauge(int fuel) {
	this->fuelGauge = fuel;
}
//Main.cpp
#include "Car.h"

void main() {
	Car c;
	c.setFuelGauge(300);
	c.getFuelGauge();
	return;
}

위와 같이 Car.cpp에 inline 함수를 적용할 경우 컴파일에 실패한다.

inline 함수는 컴파일 과정에서 함수의 호출 위치에 함수의 몸체 부분이 삽입되는 것이다.

 

즉, Main.cpp에서 get/set이 인라인 함수가 아니라면 Car 클래스의 멤버함수인지만 확인하고 컴파일은 완료된다.

그러나 인라인 함수이기 때문에, get/set은 함수 몸체로 대체되어야 한다.

 

//Car.h
#ifndef __Car_h__
#define __Car_h__

class Car {
private:
	int fuelGauge;
public:
	void getFuelGauge();
	void setFuelGauge(int fuel);
};

inline void Car::getFuelGauge() {
	printf("now fuel : %d", this->fuelGauge);
}

inline void Car::setFuelGauge(int fuel) {
	this->fuelGauge = fuel;
}

#endif

그래서 위와 같이 클래스 선언과 동일한 파일에 함수의 몸체가 저장되어, 컴파일러가 참조할 수 있게 해야 한다.

( 컴파일러는 파일 단위로 컴파일을 한다. = Main.cpp 컴파일 과정에 Car.cpp을 참조하지 않는다. )