_ReturnAddress
Только для систем Microsoft
Встроенный _ReturnAddress предоставляет адрес инструкции в вызывающей функции, которая будет выполнена после того как элемент управления будет возвращено вызывающему объекту.
Постройте следующие программы и через его в отладчике. При заходе с помощью программы обратите внимание, адрес, который возвращается из _ReturnAddress. Затем сразу после возврата из функции, _ReturnAddress использовалось, откройте Практическое руководство. Использование окна дизассемблирования и обратите внимание, что адресом следующей инструкции при выполнении быть совпадения адрес, возвращенные из _ReturnAddress.
Оптимизация как встраивание могут повлиять на обратный адрес. Например, если образец программы ниже компилироваться с /Ob1, то inline_func будет встроенным в вызывающем функцию, main. Поэтому вызовы _ReturnAddress из inline_func и main будут каждую продукцию одно и то же значение.
При _ReturnAddress будет использоваться в программе компилированной с /clr функция, содержащего вызов _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;
}