4

トレーサーに戻り値を出力したいのですが、2 つの質問があります

  1. 返品先住所を取得するには?
  2. 戻り位置は ~Tracer() の前または後に更新されますか?

ここにテキストが必要なので、Stackoverflow はコードをフォーマットします。

struct Tracer
{
  int* _retval;
  ~Tracer() 
  { printf("return value is %d", *_retval); }
};


int foo()
{
  Tracer __tracter = { __Question_1_how_to_get_return_address_here__ };

  if(cond) {
     return 0;
  } else {
     return 99;
  }

  //Question-2: 
  // return postion is updated before OR after ~Tracer() called ???
}
4

3 に答える 3

5

質問1のヒントが見つかりました。今Vcコードをチェックしています

gcc の場合、__builtin_return_address http://gcc.gnu.org/onlinedocs/gcc/Return-Address.html

Visual C++ の場合、_ReturnAddress

于 2012-11-20T15:55:40.837 に答える
3

C++ でこれを移植可能または確実に実行することはできません。戻り値はメモリ内またはレジスタ内にある場合があり、場合によっては間接的である場合とそうでない場合があります。

おそらく、インライン アセンブリを使用して、特定のハードウェア/コンパイラで何かを動作させることができます。

考えられる 1 つの方法は、Tracer(適切な場合に) 戻り値変数への参照を取得し、破棄する前にそれを出力するテンプレートを作成することです

__また、 (2 つのアンダースコア) を含む識別子は実装用に予約されていることに注意してください。

于 2012-11-20T15:53:12.557 に答える