私はC++に比較的慣れていないので、クラスを受講しています。私たちのクラスにはラボが割り当てられており、私の先生はラボの記述を理解するのは少し難しいと言っています。ただし、彼はラボの記述に変更を加えませんでした。それで、私はラボのこの部分に出くわしました:
プリプロセッサマクロの定義
長年の慣習ではマクロ名が大文字になり、このマクロ名はTRACE_FUNCである必要があります。マクロには単一のパラメーターがあります。シンボルは、マクロをコードに適用すると関数名に置き換えられます。マクロの開始は次のようになります。
#define TRACE_FUNC( symbol ) replacement-text`
プリプロセッサは、TRACE_FUNC(sym)文字列がソースコードに存在するすべての場所で置換テキストを置換し、その置換にシンボルをフィードします。
注:#defineステートメントは、すべて1つの論理行上にある必要があります。長さを管理しやすくするために、行末に円記号を付けて改行文字をエスケープできます。これにより、プリプロセッサを満足させながら、定義を複数の行にまたがることができます。
この演習では、置換テキストは、終了セミコロンを含む完全なステートメントである必要があります。
置換テキストは、シンボルの後に呼び出されたテキスト()が続く出力ステートメントである必要があります。標準出力への改行。warning.cppソースファイルから出力ステートメントの1つをコピーして変更できます。
warning.cpp
は私たちが使用している単なるファイルTRACE_FUNC
であり、ヘッダーファイルに配置されています。
それで、私はこれを数回読みました、そして、私はそれが何を求めているのか100%確信していません。一方向から見ると、TRACE_FUNCというマクロを作成するように求められているようです。別の見方をすると、マクロTRACE_FUNCを使用するように求められます。それはすべて問題ありませんが、TRACE_FUNCの使用方法がまったくわかりません。ドキュメントがどこにも見つからず、マクロの作成方法もわかりません。私が助けを求めたとき、私の先生はちょっと言った。TRACE_FUNCが実際に何であるかについての説明がなく、非常に曲がりくねった、紛らわしい答えだったので、非常に役に立った単語ではありません。
基本的に、私の先生が言ったのは、その中の記号TRACE_FUNC
はソースコード内の関数の1つの名前である必要があるということだけでした。foo()
例として、警告内に関数があったとするとfoo()
、彼の説明から、シンボルは(または、foo、それもわかりません)であると想定されます。また、置換テキストで#
は、記号の前に置くと名前自体が置換されるようです。プリプロセッサディレクティブを表すことになっていると思いました。なぜここで使用することになっているのですか?
とにかく、私の先生が言うことをすることはほとんど何もしません。この行も
#define TRACE_FUNC( foo() ) #foo() called. ;
この行も
#define TRACE_FUNC( foo ) #foo () called. ;
テキストを置き換えます。これは、#defineディレクティブの操作であると確信しています。ですから、先生の言ったことを間違った方法で適用しているに違いありませんが、なぜそれが間違っているのか、どうやって修正するのかはよくわかりません。
だから、私の質問。TRACE_FUNC
実際にはマクロですか?もしそうなら、私が読むことができるドキュメントはありますか?または、私は作成することTRACE_FUNC
になっていますか?もしそうなら、私はそれをどのくらい正確に行うことになっていますか?