2012-03-01 9 views
5

デバッグ/ロギングプログラムで作業していて、各関数内に貼り付けることができるマクロを作成することができたら、関数名関数が呼び出されるたびにパラメータ値が返されます。コンパイル時に関数名を再構築することができますが、問題はパラメータ値をどのように出力するかです。関数内で関数名とパラメーター値を取得するマクロ

UPDATE:パラメータを取得するためにアーティクルを読んでいたのですが、アセンブリコードを呼び出してスタックポインタを操作していましたが、これはクロスプラットフォーム互換ではありません。

+2

CまたはC++?異なる言語。 – Puppy

+0

しかし、マクロは両方とも同じでなければなりません。聴衆を広げるために両方を選択しました – tunafish24

答えて

2

関数名に__FUNCTION__または__func__マクロを使用できます。パラメータについては、これを実現するためのビルトインマクロはないと思います。

その他の有用なマクロは__LINE____FILE__です。

EDIT:

__FUNCTION____func__は、標準の一部ではありませんが、広くサポートされています。事前に定義されたマクロを

16.8情報:実装によって定義

__cplusplus 
__DATE__ 
__FILE__ 
__LINE__ 
__STDC_HOSTED__ 
__TIME__ 

とマクロ:関数名の

__STDC__ 
__STDC_VERSION__ 
__STDC_ISO_10646__ 
+3

'__func__' *は標準の一部ですが、マクロではありません。おそらくそれがあなたがその場所でそれを見つけられなかった理由です。 –

+0

@JensGustedt私たちはC++標準について話していますか? –

+0

いいえ私はCについて話していました.C11ではマクロではなく、定義済みの識別子6.4.2.2です。 AFAIRは既にC99に入っていたので、C++でもなければなりません。 –

1

、あなたが識別子__func__(C99以降)標準を使用することができます。

C++では、GNU拡張識別子__PRETTY_FUNCTION__もパラメータタイプを出力します。

+0

質問者は、マクロから関数名を取得する方法を知っていたと述べました - 彼の関心事は関数のパラメータを出力していたことでした。 – Perry

0

すべてのパラメータ値を取得して印刷する移植性の高い方法はありません。マクロから行うことはできません。あなたは、あなたが望むものを達成するために別の方法を使わなければならないかもしれません。

+0

他の方法は何ですか?私は確かにCコードの代わりにマクロを使用することができます。 – tunafish24

+0

関数宣言のコードを無駄にしたマクロを使ってすべての関数宣言を行い、その値を関数自体の先頭に出力するという面白いことがあります。これはきれいではありません - 私はその道を下ることはありません。そういうわけで、狂気がある。現実の世界では、単にgdbを使うか、必要なときに必要なものを印刷してください。 – Perry

+0

@Perryどうやってそれをやってみたいですか?あなたが実際の例を提供できるなら、私から+1してください。 –

0

Hereマクロを使用したデバッグの例とテクニックです。 MS specificGNUのリスト

関連する問題