2016-12-21 4 views
0

機能のアドレスは、ブラケット付きの名前です。しかし、私がcoutを使ってアドレスをプリントアウトすると、間違っています。機能のアドレスを取得するには?

cout<<function_address<<endl; 
+0

C++タグ(おそらくC++ 11)がありません。 –

答えて

2

bの関数のアドレスは、ブラケット

との名前であるように、関数のアドレスが関数を仮定

「はint型function_address()」であり、コードは、ありますは、の名前ではありません。これは、例えば以下のようなメモリアドレスである。 0x0000000000020d57(Linuxでは、プログラムを実行しているプロセスのvirtual address spacenmを使用してグローバル関数のアドレスを取得できます)。 機能の名前はランタイム(ただし、dynamic linkingに関連する場合を除き、標準C++には含まれていませんが、実装に関連しています)で忘れてしまいます。実行可能ファイルのシンボルテーブルstripでも可能です。関数名は、コンパイル時およびリンク時にのみ重要です。

一般に、そのアドレスから機能の名前を取得することはできません。

C++11でもちろん

、あなただけの関数名で式を持っている場合(例えば、指数std::exp)という式は、その値として関数のアドレスを持っています。または、例えば:その後、

extern void fun(int); /// declare the function fun, defined elsewhere. 
auto fp = fun; 

fpは一つの引数、整数を取る関数へのポインタであり、それは何も(無効)を返しません。同様funこのポインタfpはコンパイラなどによって、時間(とリンカを構築(ない名)関数のアドレスを保持し、関数fun(のアドレスをポインタfun)の初期化はで行われます実行時に何も起こりません)。したがって、std::cout << fp << std::endlはブール値フラグ(名前ではない)を出力します。そうすればstd::cout << fun << std::endlとなります。そしてstd::cout << (void*)fp << std::endlはいくつかのアドレスを出力します。

シンボル(関数名など)の詳細については、LevineのLinkers and loaders本を読んでください。 Linuxの

、具体的には、関数のアドレス(バイナリを、それはいくつかELFファイルにいくつかグローバル名前を持つと仮定すると、あなたがstripなかった、そして適切なオプションとリンクの(mangled)の名​​前を取得するためにdladdr(3)を使用する場合があります - 例えば-rdynamic)。

C++ 11では、一部の関数には名前がありません(一部にはグローバルという名前はありません)。 lambda expressions & closuresについて読むstd::functionも参照してください。

+0

ではなく、 "ptr = func_name;"のコード実際に働くことができます –

+0

しかし、それは関数名を計算しません。 –

+1

@MichaelTsaiそれは単に暗黙の変換です。コンパイラは 'ptr =&func_name;' – KABoissonneault

関連する問題