5

私は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になっていますか?もしそうなら、私はそれをどのくらい正確に行うことになっていますか?

4

2 に答える 2

6

うわー、なんてゴミだ!プリプロセッサの複雑さではなく、C++を正しく学習しているはずです。

これがあなたがしていることになっていることですが、なぜ誰かが推測しているのですか。

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

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

警告.cppの例があるとstd::cout思いますが、そうでない場合は、warning.cppで見つけたものに上記を適合させる必要があります。

各関数はTRACE_FUNCマクロを使用して開始するため、コードの実行を追跡できます。教授がこれが初心者にとって良い考えであると考える理由は私を超えています。たとえそれが良い考えであったとしても、あなたが自分で詳細を理解することが期待されていることはさらに愚かです。

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

于 2012-09-08T14:16:01.330 に答える
-1

ここに例があります:ここで標準関数printfを置き換えるために、librayの出力print関数を使用してください

 #define TRACE_FUNC(sym) printf("%s() called", #sym);

として使用するには

TRACE_FUNC(printf)

出力は次のようになります

printf() called

実際のタスクは、定義された形式でシンボルを印刷することです。したがって、#defineにprintfまたは同様の関数が必要です。

于 2012-09-08T14:24:28.350 に答える