インライン関数
関数をインラインすると、関数の完全なボディが、選択した関数の出現ごとに挿入されます。
この機能に関するデモを見るにはここをクリックします。
実装に関する注意事項
- 関数の定義を選択すると、関数がソースファイルから削除され、この関数の各呼び出しは、関数のボディに置換されます。
- 関数の呼び出しを選択すると、この呼び出しのみがインラインされ、関数定義は変更されません。
- 関数のパラメーターおよびローカル変数は、置換時に名前が変更されます。
制限事項
- サポートされるのはインライン関数および static 関数のみです。
- 次のものはインラインできません。
- 再帰関数
- 複数の return ステートメントを持つ関数
- アドレスにより参照される関数
例
static int foo(int a) { int b = a + 2; return b; } int main() { int c; c = foo(1) ; return c; }
この例では、'foo' をインラインできません。
結果
int main() { int c; int a = 1;int b = a + 2;c = b; return c; }
システムヘッダーで宣言された関数はインラインできない
システムヘッダーで関数定義が検出された場合、次のようなメッセージが表示されます。
たとえば、このメッセージは、下の抜粋の 'math.h' から 'pow' をインラインしようとすると、表示されます。
#include <iostream> #include <stdio.h> #include <math.h> using namespace std; #define PI 3.14 static float getArea(float radius) { float area = PI * *pow(radius, 2)*; return area; }
関数をインラインできません:この関数は、その完全修飾名で呼び出されます
別のクラスメンバーから直接呼び出される関数はインラインできますが、次のような状況で 'x->foo()'、'x.foo()' などの関数をインラインしようとすると、このメッセージが表示されます。
class A{ void foo() {...} void abc(); } void A::abc() { foo(); //we can inline this A::foo(); //we can't inline this A x = new A(); x->foo(); //we can't inline this }