_ReturnAddress

Microsoft 固有の仕様

_ReturnAddress 組み込みでは、呼び出し元に制御が戻った後に実行される呼び出し元関数の命令のアドレスが提供されます。

次のプログラムをビルドし、デバッガーでステップ実行します。 プログラムをステップ実行する場合は、_ReturnAddress から返されるアドレスをメモします。 次に、_ReturnAddress が使用された関数から返された直後に、[方法 : [逆アセンブル] ウィンドウを使用する] を開き、次に実行する命令のアドレスが、_ReturnAddress 返されたアドレスと一致することを確認します。

インリングなどの最適化は、戻り値のアドレスに影響を及ぼす可能性があります。 たとえば、以下のサンプル プログラムが /Ob1 でコンパイルされている場合、inline_func は呼び出し元の関数 main にインライン化されます。 このため、inline_funcmain からの _ReturnAddress への呼び出しでは、それぞれ同じ値が生成されます。

/clr でコンパイルされたプログラムで _ReturnAddress を使用すると、_ReturnAddress の呼び出しを含む関数がネイティブ関数としてコンパイルされます。 マネージドとしてコンパイルされた関数が _ReturnAddress を含む関数を呼び出すと、_ReturnAddress が想定通りに動作しないことがあります。

必要条件

ヘッダー ファイル<intrin.h>

// compiler_intrinsics__ReturnAddress.cpp
#include <stdio.h>
#include <intrin.h>

#pragma intrinsic(_ReturnAddress)

__declspec(noinline)
void noinline_func(void)
{
   printf("Return address from %s: %p\n", __FUNCTION__, _ReturnAddress());
}

__forceinline
void inline_func(void)
{
   printf("Return address from %s: %p\n", __FUNCTION__, _ReturnAddress());
}

int main(void)
{
   noinline_func();
   inline_func();
   printf("Return address from %s: %p\n", __FUNCTION__, _ReturnAddress());

   return 0;
}

Microsoft 固有の仕様はここまで

関連項目

_AddressOfReturnAddress
コンパイラの組み込み
キーワード