2012-01-14 3 views
0

私はいくつかのPETScサンプルコードを見ていた、と私は、このスニペットに出くわした:mainが始まる直前に__FUNCT__とは何ですか?

#undef __FUNCT__ 
#define __FUNCT__ "main" 

__FUNCT__のように設定するのは、すべての機能(または単にメイン?)が標準のCプログラミング規則の前に設定されていますか?

もしそうなら、なぜこれが行われますか?

答えて

2

これは、__FUNCTION__標準マクロをサポートしていないCコンパイラの省略形または回避策のようです。識別子が再び宣言し、私は誰もが、この設定を行うに見たことがない#define __FUNCT__ "main"

個人的に行に「メイン」の文字列に設定されている横

+0

標準マクロ '__FUNCTION__ 'は何をしますか?現在の関数の名前だけが入っていますか? – Dan

+1

@Danはい、 '__FUNCTION__'マクロは、マクロが呼び出される関数の名前にコンパイラによって自動的に設定されます。トレース出力とデバッグ文を書くのが非常に簡単です。 – hypercode

+1

'__FUNCTION__'はマクロでも標準的でもなく、プリプロセッサは言語セマンティクスについて何も知らないので、マクロではありません。 C99には、__func__という定義済みの識別子が導入されています。 – Christoph

3

petsc.hを見てみると、例えば、関数のパラメータとして__FUNCT__を渡すマクロの束があるように表示されます。

#define PetscFree(a) ((a) ? ((*PetscTrFree)((a),__LINE__,__FUNCT__,__FILE__,__SDIR__) || ((a = 0),0)) : 0) 

私の推測では、/ PetscTrFree()(など)はデバッグのためにこれらの引数を取るということですロギング目的。

1

はまず__FUNCT__のすべての以前の宣言は、#undefを使用してコンパイルによって無視されますそれを "main"にすると、ライブラリーなどを使用したいが、宣言された関数名を使用したくない場合に便利であることがわかります。なぜ、これを単に作成するのではなく識別子にするのか分かりません別の関数は同じパラメータをとり、あなたが望むものを呼び出します。

いずれの場合でも、私はこれがstandar Cのプログラミング規約であるとは考えていません。限定されたコードスニペットからは、それが何のために使われているのか、なぜそれが行われたのかが明確ではありません。 comments in the PETSc source codeから

3

${PETSC_DIR}/src/snes/examples/tutorials/ex3.c、行33-40):直下の各ルーチンの前に

注意、 我々は、ルーチン名を含む文字列であることをマクロ__FUNCT__を定義します。 定義されている場合、このマクロはPETScエラーハンドラで使用され、 ルーチン名の完全なトレースバックを提供します。すべてのPETScライブラリルーチンはこの マクロを使用し、ユーザーはアプリケーションの中でオプションとして コードを使用することもできます。 に関係なく、アプリケーションコードで__FUNCT__が定義されているかどうかに関係なく、PETScエラーのトレースバックを取得できます。このマクロは単に にアプリケーションルーチン名の追加されたトレースバックの詳細を提供します。

関連する問題