_ReturnAddress
Microsoft 固有の仕様
_ReturnAddress
組み込みでは、呼び出し元に制御が戻った後に実行される呼び出し元関数の命令のアドレスが提供されます。
次のプログラムをビルドし、デバッガーでステップ実行します。 プログラムをステップ実行する場合は、_ReturnAddress
から返されるアドレスをメモします。 次に、_ReturnAddress
が使用された関数から返された直後に、[方法 : [逆アセンブル] ウィンドウを使用する] を開き、次に実行する命令のアドレスが、_ReturnAddress
返されたアドレスと一致することを確認します。
インリングなどの最適化は、戻り値のアドレスに影響を及ぼす可能性があります。 たとえば、以下のサンプル プログラムが /Ob1 でコンパイルされている場合、inline_func
は呼び出し元の関数 main
にインライン化されます。 このため、inline_func
と main
からの _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 固有の仕様はここまで