2

例えば:

using namespace std;
#include <iostream>

void funcOne() {
}

void funcTwo( int x ) {
}

int main() {

  void (*ptrOne)() = funcOne;
  cout << ptrOne << endl;      //prints 1

  void (*ptrTwo)( int x ) = funcTwo;
  cout << ptrTwo << endl;      //prints 1

  int (*ptrMain)() = main;
  cout << ptrMain << endl;     //prints 1

}

この背後にある理由を知っている人はいますか?最初は、関数を呼び出すことがないため関数がメモリに存在せず、スタックに追加されないためだと思いました。しかし、メイン関数へのポインターの値でさえ 1 を出力します。

4

4 に答える 4

1

C++ での演算子のオーバーロードは、あらゆる種類の厄介な複雑さを追加します。(素晴らしいこともできますが、頭の痛い問題になることもあります。)

他の回答で説明されているように、C++ は関数ポインターに対して自動型強制を行っています。古き良き C スタイルprintfを使用するだけで、期待どおりの結果が得られるはずです。

#include <cstdio>

// ...

printf("func1: %p\nfunc2: %p\n", funcOne, funcTwo);
于 2013-06-30T03:09:12.660 に答える