機能のアドレスは、ブラケット付きの名前です。しかし、私がcoutを使ってアドレスをプリントアウトすると、間違っています。機能のアドレスを取得するには?
cout<<function_address<<endl;
機能のアドレスは、ブラケット付きの名前です。しかし、私がcoutを使ってアドレスをプリントアウトすると、間違っています。機能のアドレスを取得するには?
cout<<function_address<<endl;
bの関数のアドレスは、ブラケット
との名前であるように、関数のアドレスが関数を仮定
「はint型function_address()」であり、コードは、ありますは、の名前ではありません。これは、例えば以下のようなメモリアドレスである。 0x0000000000020d57
(Linuxでは、プログラムを実行しているプロセスのvirtual address spaceにnm
を使用してグローバル関数のアドレスを取得できます)。 機能の名前はランタイム(ただし、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も参照してください。
ではなく、 "ptr = func_name;"のコード実際に働くことができます –
しかし、それは関数名を計算しません。 –
@MichaelTsaiそれは単に暗黙の変換です。コンパイラは 'ptr =&func_name;' – KABoissonneault
C++タグ(おそらくC++ 11)がありません。 –