2016-11-20 14 views
0

私は今、私はすべてのアレイメンバーを通じて横断し、別の.datデータファイルに出力をダンププログラムを開発したい関数ポインタを関数名に変換するには?

func_pointer_t func_array[] = {func_1, func_2, func_3, ...}; 

、同じ機能を持つ関数の配列を持っています。出力は次の形式を持っている必要があります。

func_1 func_1_output 
func_2 func_2_output 
func_3 func_3_output 
... 

だから私の質問は - アレイメンバーを横断するとき、我々はプログラムが関数ポインタが(例えばfunc_arrayを指している機能名を知らせることができるか[0]でありますfunc_1を指しています)?

+1

http://stackoverflow.com/questions/351134/how-to-get-functions-name-from-functions-pointer-in:

は、あなたがしたいです、あなたもマップを使用することができます-c – chasep255

+1

C++にタグを付けました。マップを使用してみませんか? – MyUsername112358

+2

コンパイル時に変数/関数名が失われます。彼らはちょうどプログラマーを助けるために周りにあります。 – alk

答えて

5

あなたが探しているものをアーカイブする標準的な方法はありません。すべての可能な解決策は、その名前に関数のアドレスを解決するためのシステムに依存した方法を必要とするいずれか(とさえ、それは必ずしも常に動作しない)かそこらのようなfunc_arrayを変更:

struct { 
    func_pointer_t func; 
    const char * name; 
} func_array[] = { 
    { func_1, "func_1" }, 
    { func_2, "func_2" }, 
    { func_3, "func_3" }, 
    ... 
}; 

あなたが仕事を容易にするために、マクロを使用することができます。その後、

#define FUNC_DEF(func) { func, #func }, 

とこのようにそれを使用しますので、

struct { 
    func_pointer_t func; 
    const char * name; 
} func_array[] = { 
    FUNC_DEF(func_1) 
    FUNC_DEF(func_2) 
    FUNC_DEF(func_3) 
    ... 
}; 

これはあなたのためのオプションである場合、あなたはあなたのソリューションを得ました。もしそうでなければ、どのシステムをターゲットにしているのかを伝える必要があります。

Gdind Parmarがヒントしたstd :: mapソリューションのように、反復してキー< - > valueのペアを使用することができます。

+0

ニッティング:マクロを大文字にしてください。 – alk

0

アセンブリ/マシンコードレベルでは、(ビルドにデバッグ情報がない限り)「関数名」はないことを覚えておく必要があります。関数がどこから始まるかを示すアドレスしかありません。

このようなことを追跡するには、データ構造を使用する必要があります。 C++を使っているのであれば、コメント者として@map<string, function_pointer> @ MyUsername112358を指摘してください。

+0

'void * function_ptr;'は常にエラーです。データポインタと関数ポインタを混在させてはいけません。 –

+0

@BodoThiesenあああなたは正しい。 C++で厳密に作業していると言っていたので、私の答えのC部分を削除しました –

1

あなたは、単にその名前の関数ポインタを一致するペアの配列を格納することで、名前を追跡することができます。

std::pair<const char*, func_pointer_t>[] func_array = { 
    {"func_1", func_1}, 
    {"func_2", func_2}, 
    {"func_3", func_3} 
}; 

あなたは今、それはあまりにも名前だ使用することができます。

std::map<std::string, func_ptr_t> func_array { 
    {"func_1", func_1}, 
    {"func_2", func_2}, 
    {"func_3", func_3} 
}; 
+0

"artsy"とは何を意味していますか? –

+0

私の電話に悪いオートコレクターがあることを意味します –

+0

ええ、私はそれらの1つを持っています! –

関連する問題