インライン関数

関数をインラインすると、関数の完全なボディが、選択した関数の出現ごとに挿入されます。

この機能に関するデモを見るにはここをクリックします

実装に関する注意事項

  • 関数の定義を選択すると、関数がソースファイルから削除され、この関数の各呼び出しは、関数のボディに置換されます。
  • 関数の呼び出しを選択すると、この呼び出しのみがインラインされ、関数定義は変更されません。
  • 関数のパラメーターおよびローカル変数は、置換時に名前が変更されます。

制限事項

  • サポートされるのはインライン関数および 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
 }