-PR-
締切済み

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

  • 暇なときにでも
  • 質問No.5794
  • 閲覧数3684
  • ありがとう数16
  • 気になる数0
  • 回答数5
  • コメント数0

お礼率 100% (5/5)

プログラムを作成している時につけた関数名をその関数の中で文字列として受け取る方法はあるのでしょうか。
(あるとしたらデバッグ文を作成する時にかなり生産性が上がると思われますので)

void xxxx()
{
printf("%s\n",???);
}

画面に関数名を表示させたい(関数名の文字列を関数内でセットしない方法で)

可能かどうかも含めて、よろしくお願いします。
通報する
  • 回答数5
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

回答 (全5件)

  • 回答No.1

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

お礼率 100% (5/5)

回答ありがとうございます。

おっしゃる通り、コンパイルしたバイナリの中に関数名は
残っていませんよね。
ご教授くださった、関数の外枠~ の方法をこれから調査してみようと思います。
投稿日時 - 0000-00-00 00:00:00
関連するQ&A


  • 回答No.2
レベル13

ベストアンサー率 26% (511/1924)

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

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

お礼率 100% (5/5)

回答ありがとうございました。

私の質問の仕方が悪かったと思いますが、
おっしゃられているデバッグ用の関数に渡す
パラメータとして、取得したかったのです。
そうすれば、デバッグ関数を呼び出す時に
どの関数内でもコピー&ペーストで、デバッグ
関数呼出しが記述できると思いまして。

ご回答くださった事、重ねてお礼申し上げます。
投稿日時 - 0000-00-00 00:00:00
  • 回答No.3
レベル8

ベストアンサー率 25% (9/35)

関数名の取得は、困難ですが・・・ ANSIに準拠しているコンパイラの場合 ファイル名や行番号の取得をプリプロセッサ で行えますから、次のようなデバッグ関数が、 BEJOEさんの考えるデバッグ文に近いと思います。 どのステップを通過したかを出力できるので、 試験時に役立つと思います。(試験網羅の目安とか) #include <iostream.h> void debug_pr ...続きを読む
関数名の取得は、困難ですが・・・
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

お礼率 100% (5/5)

回答ありがとうございます。

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

ベストアンサー率 25% (9/35)

>私の探し方が悪かったかもしれませんが、そのような >マクロをご存知でしょうか。 マクロ残念ながら、ないようですね。 関数名取得は無理ですね。 共通関数の引数に__FILE__,__LINE__マクロを暗に指定 させるようなつくりにして、呼び出し元を関数ではなく、 ファイル名+行番号で特定できるようにしてデバッグ するしかけで、デバッグの目的を達成できるのではないか と考え ...続きを読む
>私の探し方が悪かったかもしれませんが、そのような
>マクロをご存知でしょうか。
マクロ残念ながら、ないようですね。
関数名取得は無理ですね。

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

お礼率 100% (5/5)

再度の回答ありがとうございました。

そうですね、プログラミングのフェーズでしたら、デバッグ指針、規約を規定する事により有効な手段ですよね。

実は今回の場合、すでにユーザの元で稼動しているプログラムに再現性の無いエラーが発生しているもののトラップ
として利用したかったのです。
(私の状況説明に不足がありました)

# ほんと、関数名マクロ、すっごく欲しいです。
投稿日時 - 0000-00-00 00:00:00
  • 回答No.5
レベル5

ベストアンサー率 66% (2/3)

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

お礼率 100% (5/5)

回答ありがとうございます。

結局いい方法が見つからないまま、仕方なく以下のように、
共通関数側の受け取りパラメータを1つ増やして(文字列のポインタ)
呼出し側で、自分の関数名をリテラルでパラメータとして渡すという方法を取ってしまいました。

funcA()
{
a=0;
fancB(a,"funcA");

}

funcB(int a,char* sName)
{
printf("%d %s",a,sName); //本当はファイル出力関数

}


もっといい方法があればよかったのですが。
早く仕掛けないと、本来のバグ出しに影響しそうなので、
妥協してしまいました。(泣)

投稿日時 - 0000-00-00 00:00:00
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


新大学生・新社会人のパソコンの悩みを解決!

いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ