• 締切済み

自分の関数名を文字列で受け取る方法

プログラムを作成している時につけた関数名をその関数の中で文字列として受け取る方法はあるのでしょうか。 (あるとしたらデバッグ文を作成する時にかなり生産性が上がると思われますので) 例 void xxxx() { printf("%s\n",???); } 画面に関数名を表示させたい(関数名の文字列を関数内でセットしない方法で) 可能かどうかも含めて、よろしくお願いします。

みんなの回答

回答No.5

あらかじめ関数ポインタと関数名の文字列をテーブルに入れておき、デバッグ関数側でテーブルを参照すればよいと思います。

BEJOE
質問者

お礼

回答ありがとうございます。 結局いい方法が見つからないまま、仕方なく以下のように、 共通関数側の受け取りパラメータを1つ増やして(文字列のポインタ) 呼出し側で、自分の関数名をリテラルでパラメータとして渡すという方法を取ってしまいました。 funcA() { a=0; fancB(a,"funcA"); } funcB(int a,char* sName) { printf("%d %s",a,sName); //本当はファイル出力関数 } もっといい方法があればよかったのですが。 早く仕掛けないと、本来のバグ出しに影響しそうなので、 妥協してしまいました。(泣)

  • nihonrisu
  • ベストアンサー率25% (9/35)
回答No.4

>私の探し方が悪かったかもしれませんが、そのような >マクロをご存知でしょうか。 マクロ残念ながら、ないようですね。 関数名取得は無理ですね。 共通関数の引数に__FILE__,__LINE__マクロを暗に指定 させるようなつくりにして、呼び出し元を関数ではなく、 ファイル名+行番号で特定できるようにしてデバッグ するしかけで、デバッグの目的を達成できるのではないか と考えます。 ファイル名と行番号が特定できれば、関数が特定できると いえますので、十分ではないでしょうか。後は仕掛けの 使い方であって、デバッグ関数、共通関数の実装 とデバッグ指針・規約により、グループまたは個人の生 産性の向上は見込めると思います。 # でも関数名マクロってほしい気がする(笑)

BEJOE
質問者

お礼

再度の回答ありがとうございました。 そうですね、プログラミングのフェーズでしたら、デバッグ指針、規約を規定する事により有効な手段ですよね。 実は今回の場合、すでにユーザの元で稼動しているプログラムに再現性の無いエラーが発生しているもののトラップ として利用したかったのです。 (私の状況説明に不足がありました) # ほんと、関数名マクロ、すっごく欲しいです。

  • nihonrisu
  • ベストアンサー率25% (9/35)
回答No.3

関数名の取得は、困難ですが・・・ ANSIに準拠しているコンパイラの場合 ファイル名や行番号の取得をプリプロセッサ で行えますから、次のようなデバッグ関数が、 BEJOEさんの考えるデバッグ文に近いと思います。 どのステップを通過したかを出力できるので、 試験時に役立つと思います。(試験網羅の目安とか) #include <iostream.h> void debug_prt(char* fname,int no) { cout << "ERROR [" << fname << " " << no << "行目]" << endl ; } void main() { if(なんらかの判定) { debug_prt(__FILE__,__LINE__); } debug_prt(__FILE__,__LINE__); } __FILE__,__LINE__以外にも便利なマクロがあるので、 調べてみてください。 #余談 #インデントがうまくOKWebの回答に反映できないですね。

BEJOE
質問者

お礼

回答ありがとうございます。 ご丁寧にサンプルまで添えて頂いたので、早速実行してみました。イメージは正にこの通りです。ただ、出力されるメッセージがファイル名でした。 このデバッグ文を埋め込みたいのはソースに散在している 関数から呼ばれる共通関数の為、呼出し元の関数名(この例でいくとmain())を表示(実際にはファイルに落とす)させたいのです。VC++のヘルプでマクロを調べてみたのですが、関数名そのものを取得できるマクロが存在しないようでした。私の探し方が悪かったかもしれませんが、そのようなマクロをご存知でしょうか。

  • shigatsu
  • ベストアンサー率26% (511/1924)
回答No.2

一応世の中にはデバッガという便利なものがあるんですが・・・・ で、ご質問の様に関数の中で関数名を取得してデバッグ プリントするってのは、得策とは思えません。 デバッグプリントするなら、デバッグ用の関数を一つ 作って、引数に色々なパラメータを指定できる様にして おいたほうが良いです。 例えば、関数名、引数の値、ローカル変数の値などなど。 で、デバッグ用の関数でタイムスタンプと共にフォーマッ トしてファイルに出力するほうが便利ですよ。 使いまわしもできるし。

BEJOE
質問者

お礼

回答ありがとうございました。 私の質問の仕方が悪かったと思いますが、 おっしゃられているデバッグ用の関数に渡す パラメータとして、取得したかったのです。 そうすれば、デバッグ関数を呼び出す時に どの関数内でもコピー&ペーストで、デバッグ 関数呼出しが記述できると思いまして。 ご回答くださった事、重ねてお礼申し上げます。

noname#151056
noname#151056
回答No.1

不可能だと思います。 コンパイルしたバイナリの中に関数名は残ってないはずですから。 素直に直接文字列を指定するか、もしくは 関数の外枠を作るようなときに一緒にデバッグ文を 付加するようなマクロを組んでやればいいのでは ないでしょうか。

BEJOE
質問者

お礼

回答ありがとうございます。 おっしゃる通り、コンパイルしたバイナリの中に関数名は 残っていませんよね。 ご教授くださった、関数の外枠~ の方法をこれから調査してみようと思います。

関連するQ&A