2012-09-08 7 views
5

私はC++には比較的新しいので、クラスを用意しています。私たちのクラスにはラボが割り当てられており、私の先生はラボの書き上げはちょっと分かりにくいと言っていました。しかし、彼は研究室の執筆に何ら変更を加えなかった。だから、私は研究室のこの部分に出くわした:プリプロセッサマクロを定義する

定義プリプロセッサマクロ

長年の慣習は、マクロ名を大文字、このマクロ名はTRACE_FUNCでなければなりません。マクロには単一のパラメータがあり、コードにマクロを適用するときに関数名に置き換えられます。マクロの開始は、次のようになります。

#define TRACE_FUNC(symbol) replacement-text` 

とプリプロセッサはTRACE_FUNC(SYM)文字列がソースコードに存在し、その交換にシンボルを養うことをどこでも置換テキストに置き換えます。

注:#define文は、すべて1つの論理行に記述する必要があります。長さを管理しやすいようにするには、行の最後にバックスラッシュを付けて改行文字をエスケープします。プリプロセッサを幸せに保ちながら複数の行に渡って定義を張ることができます。

この練習では、置換テキストは、終了セミコロンを含む完全なステートメントでなければなりません。

置換テキストは、シンボルの後にtext()が呼び出される出力文でなければなりません。標準出力への改行が含まれます。出力文の1つをwarning.cppソースファイルからコピーして変更することができます。

warning.cppは、私たちが使用しているファイルで、TRACE_FUNCはヘッダーファイルに置かれています。

私はこれを数回読んで、何を求めているのか100%確信していません。それを見ると、TRACE_FUNCというマクロを作成するように求められているようです。別の方法で見ると、マクロTRACE_FUNCを使用するように求められます。そのすべては問題ありませんが、TRACE_FUNCの使用方法はわかりません。どこのドキュメントも見つけられず、マクロの作成方法もわかりません。私が助けを求めたとき、先生はちょっと言った。 TRACE_FUNCが実際に何であるかを説明することなく、非常に巻く、混乱した答えだったので、非常に役に立つものではありませんでした。

私の先生が言ったことは、基本的にTRACE_FUNCの中の記号はソースコード内の関数の名前である必要があります。たとえば、警告内に関数foo()があったとすると、その説明からシンボルはfoo()(またはfoo、どちらもわからない)と考えられます。また、置き換えテキストでは、シンボルの前に#を置くと、名前自体が置き換えられます。私はそれがプリプロセッサ指令を示すと考えました。なぜ私はここでそれを使用するのですか?

とにかく、私の先生が言うことは、ほとんど何もしません。このライン

#define TRACE_FUNC(foo()) #foo() called. ;

もこのライン

#define TRACE_FUNC(foo) #foo() called. ;

どちらも私がの#defineディレクティブの動作であるかなり確信して任意のテキストを、交換してください。だから私は教師が間違った方法で言ったことを適用する必要がありますが、私は本当にそれが間違っているか、それを修正する方法を本当に知らない。

私の質問です。 TRACE_FUNCは実際にはマクロですか?その場合は、私が読むことができるドキュメントがありますか?または、私はTRACE_FUNCを作成するはずですが、もしそうなら、私はそれをどうやってやろうとしていますか?

答えて

6

うわー、何がまったくゴミだ!プリプロセッサの複雑さではなく、C++の知識を習得しているはずです。

あなたは何をやっているのですか、誰が推測しているのですか?

#define TRACE_FUNC(sym) std::cout << #sym << "() called\n" 

void foo() 
{ 
    TRACE_FUNC(foo); 
    ... 
} 

私がいないならば、あなたはwarning.cppで見つける何に上記を適用する必要がありますstd::coutを使用warning.cppからの例があると仮定しています。

考えられるのは、各関数がTRACE_FUNCマクロの使用で始まるということです。そのため、コードの実行をトレースできます。なぜ教授はこれが初心者のための良いアイデアだと私が思っていないと思っているのですか?たとえそれが良いアイデアであったとしても、あなた自身の詳細がさらに愚かであることがわかるはずです。

私は上記のマクロを改善することができましたが、それはおそらくもっと混乱させるので、私はしません。今のところ、私は教授が言うことをやるだけで、それを無視します。うまくいけば、彼は後で学ぶ価値のあるものに乗ることができます。ここ

+0

ありがとうございます!これは私の先生が言っていたよりはるかに明確でした。 – FoolishOrpheus

+0

また、関数マクロの定義方法についてはhttp://stackoverflow.com/a/257425/1689451を参照してください。 –

-1

は一例です:出力は

printf() called 
でなければなりません

TRACE_FUNC(printf) 

としてそれを使用する

ここでは標準関数のprintfを交換してくださいlibrayに
#define TRACE_FUNC(sym) printf("%s() called", #sym); 

をouputを印刷機能を使用します

あなたの実際のタスクは、定義された形式でシンボルを印刷することです。 #defineにはprintfやそれに類する関数が必要です。

関連する問題