コンテンツにスキップ

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.ccsomething.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 指定は用いられます。