-1

割り当て:

Cプリプロセッサを実装する必要があります。プリプロセッサはコマンドラインツールとして実装され、入力はCソースファイル(.c拡張子)であり、出力は前処理されたファイル(.i拡張子)です。このツールにはいくつかのオプションもあります。

$ cppr <options> file.c

処理が成功すると、ファイル.iが生成されます。

<オプション>は次のようになります。

プリプロセッサオプション
--Aassertion-C-dD -dM -dN -Dmacro [= defn] -E -H
-idirafter dir -include file -imacros file
-iprefixfile -iwithprefix dir -M -MD -MM -MMD -nostdinc
–P- Umacro –undef
ディレクトリオプション
--Bprefix -Idir -I-

上記のいずれか2つを実装します。これは、要件フェーズで決定する必要があります。

これらは、GCCコンパイラによって定義されたオプションです。オプションを理解するには、GCCのマンページを参照してください。

少なくとも次の機能を実装する必要があります。

  1. コメントの削除
  2. #ifdef#endif
  3. #define定数(マクロではない)の場合
4

3 に答える 3

3

あなたが理解していないことを正確に知らずに答えるのは簡単ではありませんが、私の非常に限られたCの経験を使ってとにかく試してみます.

プリプロセッサとは プリプロセッサは、コンパイル前にコード ファイルに対して何らかの処理を行うプログラムです。たとえば、プリプロセッサ ディレクティブを使用して記号定数を定義できます。

#define PI 3.14159

次に、この値をコード全体で意味のある名前で使用できます。

area = r * r * PI;
...
circumference = 2 * r * PI;

ここでプリプロセッサが行うことは、すべての PI を指定した数値に置き換えることです。

area = r * r * 3.14159;
...
circumference = 2 * r * 3.14159;

定数がコード内の別の場所で既に定義されているかどうかに応じて、コードを含めることもできます (これは通常、複数のファイルを含むプロジェクトで使用されます)。

#define WINDOWS

...

#ifdef WINDOWS
    /* do Windows-specific stuff here */
#endif

#ifdefとの間の行は、定数が前に定義さ#endifれている場合にのみ含まれます。WINDOWS

ここまでで、プログラムが何をすべきかについてある程度理解できたと思います。

「最低限の機能」を実装するためのヒント

ここでは、教授が必要とする最小限の機能を作成する方法について、いくつかのアイデアを紹介します。これらは私の頭のてっぺんから外れているので、最初にそれらについて考えてください。

コメントの削除

入力を読みながら、" " を探します/*。これに遭遇したら、出力への書き込みを停止し、「*/」が見つかったら、再び書き込みを開始できます。boolean フラグを使用して、コメント内にいるかどうかを示します (私の知る限り、C には bool 型がないため、0 または 1 の int を使用するか、より理想的にはINSIDE_COMMENTとのような 2 つの記号定数を使用しOUTSIDE_COMMENTます)。

定数の #define (マクロではない)

# で始まる行に遭遇した場合、明らかにそれを書き出すべきではありません。ディレクティブが見つかった場合は#define、シンボリック名と値をどこかに保存し (両方とも文字列)、それ以降は入力で名前を探し、見つかるたびに代わりに値を書き出します。定数名の最大長を設定できます。これは C では 6 文字だと思います。常に入力から 6 文字をチェックします。6 文字が既知の定数名で始まる場合は、代わりに値を書き出します。

#ifdef と #endif

#ifdefコメントと同じように、の中にいるかどうかを示すブール値フラグを作成します。を見つけるとき#ifdefは、定数名を既に保存しているかどうかを確認し、それに応じて出力に書き込みます。

これが役立つことを願っています。

編集: gsのコメントも読んでください!

于 2009-02-23T09:22:50.617 に答える
2

Cの教科書には、標準のCプリプロセッサの機能が説明されているはずですが、試すこともできますman cpp

次に、これらのタスクの限定されたサブセット(つまり、プロセス#ifdef/#endifペア、および単純な#defines)を実行するプログラムを作成します。

プログラムは、コマンドラインを解析し、上記のオプションのうち少なくとも2つを受け入れ、gccマンページで説明されている方法でそれらを処理する必要があります。

于 2009-02-22T04:56:10.453 に答える
2

これがプリプロセッサオプションに関するgccのドキュメントです。これはあなたの助けになるかもしれません。それはかなり長いですが、それのほとんどはあなたが気にする必要のないオプションを扱っているので、あなたは関連するセクションを調べて選ぶことができます。

于 2009-02-22T04:56:31.980 に答える