私は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
を作成するはずですが、もしそうなら、私はそれをどうやってやろうとしていますか?
ありがとうございます!これは私の先生が言っていたよりはるかに明確でした。 – FoolishOrpheus
また、関数マクロの定義方法についてはhttp://stackoverflow.com/a/257425/1689451を参照してください。 –