inline 関数¶
関数に inline
をつけた関数のことを inline 関数といいます。
inline 関数は定義が同一である場合に限って、 異なるソースファイルで同一の定義をしてもいいと決められています。
#include <iostream>
#include "something.h"
inline void HelloWorld() {
std::cout << "Hello World!" << std::endl;
}
int main() {
HelloWorld();
Something();
return 0;
}
#ifndef SOMETHING_H_
#define SOMETHING_H_
void Something();
#endif // SOMETHING_H_
#include "something.h"
#include <iostream>
inline void HelloWorld() {
std::cout << "Hello World!" << std::endl;
}
void Something() {
HelloWorld();
}
この例では main.cc
と something.cc
で
定義が同一である inline 関数 HelloWorld()
がそれぞれ存在します。
これによって inline 関数であればヘッダファイルで関数定義をしてもリンク時にエラーにはなりません。
#ifndef HELLO_WORLD_H_
#define HELLO_WORLD_H_
#include <iostream>
inline void HelloWorld() {
std::cout << "Hello World!" << std::endl;
}
#endif // HELLO_WORLD_H_
#include "hello_world.h"
#include "something.h"
int main() {
HelloWorld();
Something();
return 0;
}
#ifndef SOMETHING_H_
#define SOMETHING_H_
void Something();
#endif // SOMETHING_H_
#include "something.h"
#include "hello_world.h"
void Something() {
HelloWorld();
}
inlineとインライン展開
しばしば inline
指定を関数につけるのは「関数を強制的にインライン展開させるための機能」と誤解されていますが誤りです。
現代のコンパイラは十分に賢いので、 inline
はインライン展開と関係が無くなっています。
したがって、ヘッダーファイルに関数を定義するときに定義は一つだけというルールを回避するためにのみ inline
指定は用いられます。