2

関数ポインターが関数のアドレスを格納することは知っています。

int fun(int x){
 //return something
} 
int (pfun*)(int)=&fun;

int main(){

std::cout << &fun << "\n"; // this print out 1
std::cout << fun << "\n" ; // this print out 1
std::cout << &pfun << "\n"; // this print out 0x0022ff40
std::cout << pfun << "\n" ; // this print out 1

 }

だから私の質問は次のとおり
です
2)たとえば、実行時にポインター関数を使用する場合の動的バインディング。コンパイラは pfun 値を 0X..... のような実際のポインタに変更して、コンパイル後に名前が存在しないため、実行時にどの関数を呼び出すかを知るようにしますか?

4

2 に答える 2

5

fun&funは同じ意味を持ちます。&funこれは に格納されている値と同等ですpfun。したがって、それらの 3 つが同じ出力を生成するのも不思議ではありません。&pfun変数のアドレスであるポインターのアドレスです。

ここで問題になるのは、その理由1です...まあ、答えは、関数ポインターを受け取るオーバーロードがないoperator<<ためstd::ostream、コンパイラーはたまたま存在するオーバーロードの中から最適な一致を見つけようとすることですbool(関数ポインターは暗黙的に変換可能です)へbool)。false関数ポインターは、関数ポインターが null の場合にのみ変換されますが、そうではありません。true値は最終的に次のように出力され1ます (これは次のようにして確認できます: std::cout << std::boolalpha << funwhich will print true)。

(このプロセスで) 関数の実際のアドレスを取得したい場合は、キャストを void ポインターに強制し、結果を出力できます。これは技術的には正しくないかもしれませんが、1... とは異なる数値が得られます。値は実行ごとに異なる可能性があり、基本的にはまったく意味がないことに注意してください。

于 2012-04-06T02:44:56.883 に答える
1

operator<<関数ポインターを出力するための適切なオーバーロードがありません。代わりにこれを試してください。

#include <iostream>

void fun() {}

void (*pFun)() = &fun;

int main ()
{
  std::cout << (void*)pFun << "\n";
}
于 2012-04-06T02:44:43.077 に答える