포스트

c++ inline compile

이 글은 Tistory에서 이전된 포스팅입니다. 원본은 여기에서 확인할 수 있습니다.

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

1
2
3
4
5
6
7
8
9
10
11
12
13
//Car.h
#ifndef __Car_h__
#define __Car_h__

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

#endif
1
2
3
4
5
6
7
8
9
10
11
//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;
}
1
2
3
4
5
6
7
8
9
//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은 함수 몸체로 대체되어야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//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을 참조하지 않는다. )

이 기사는 저작권자의 CC BY-NC 4.0 라이센스를 따릅니다.