【C言語学習ノート】『Cプログラム設計言語』第4章(関数とプログラム構造)——第3節(再帰、Cプリプロセッサ)


Warning:非ゼロベースの人たちが体の不調、めまい、吐き気、怒り、暴言を感じないように、以下の内容を見ないでください.
今日はこの章を終えて、いくつかのC言語でよく見られる概念と使い方を簡単に紹介します.
文書ディレクトリ
  • 第4章関数とプログラム構造
  • 4.10再帰
  • 4.11 Cプリプロセッサ
  • 4.11.1ファイルには
  • が含まれています.
  • 4.11.2マクロ置換
  • 4.11.3条件は
  • を含む
  • まとめ
  • 第4章関数とプログラム構造
    4.10再帰
    C言語の関数は再帰的に呼び出すことができ、すなわち、関数は直接または間接的に自身を呼び出すことができる.
    直接呼び出し自体を直接再帰と呼び,間接呼び出し自体を間接再帰と呼ぶ.
    再帰呼び出し中に処理値を格納するスタックをどこかで維持する必要があるため、再帰呼び出しはメモリのオーバーヘッドを節約しません.再帰の実行速度は速くないが、再帰コードは比較的コンパクトであり、対応する非再帰コードよりも記述と理解が容易である.ツリーなどの再帰的に定義されたデータ構造を記述する際に再帰を使用するのは特に便利である.
    4.11 Cプリプロセッサ
    C言語はプリプロセッサによっていくつかの言語機能を提供している.概念的には、プリプロセッサはコンパイル中に単独で実行される最初のステップである.2つの最も一般的なプリプロセッサ命令は、include命令(コンパイル中に指定されたファイルの内容を現在のファイルに含めるために使用される)とdefine命令(任意の文字シーケンスでタグの代わりに使用される)です.このセクションでは、条件コンパイルやパラメータ付きマクロなど、プリプロセッサの他の特性についても説明します.
    4.11.1ファイルの内容
    ファイルには、命令(すなわち、include命令)が含まれており、大量のdefine命令や宣言の処理が容易になります.ソースファイルでは、次のような形をします.
    #include "   "
     
    #include 
    

    の行は、ファイル名で指定したファイルの内容に置き換えられます.ファイル名が引用符で囲まれている場合は、ソースファイルの場所でファイルを検索します.この場所にファイルが見つからない場合、またはファイル名がカッコで囲まれている場合は、対応するルールに従ってファイルが検索されます.このルールは、特定の実装に関連しています.含まれるファイル自体には、#includeコマンドも含まれる.
    ソースファイルの先頭には、通常、一般的なdefine文とextern宣言、またはライブラリ関数に最初からアクセスする関数プロトタイプ宣言を含む複数のincludeコマンドがあります(厳密には、これらのコンテンツはファイルに単独で保存する必要はありません.ヘッダファイルへのアクセスの詳細は、特定の実装に関連しています).
    4.11.2マクロ置換
    マクロ定義の形式は次のとおりです.
    #define        
    

    これは単純なマクロ置換です.名前タグが表示される場所はすべて置換テキストに置き換えられます.#define命令の名前は変数名の名前と同じです.置換テキストは任意の文字列であってもよい.通常、#define命令は1行を占め、置換テキストは#define命令行の末尾の残りのすべての内容であるが、1つの長いマクロ定義をいくつかの行に分けることもできる.この場合、後続の行の末尾に反スラッシュ記号""を付ける必要がある.define命令で定義された名前の役割ドメインは、その定義点からコンパイルされたソースファイルの末尾まで終了します.マクロ定義では、前述のマクロ定義も使用できます.置換は記号のみで行い、引用符で囲まれた文字列には機能しません.
    #undefコマンドを使用して名前のマクロ定義をキャンセルすると、後続の呼び出しがマクロ呼び出しではなく関数呼び出しであることを保証できます.
    プリプロセッサ演算子##は、マクロ拡張に実際のパラメータを接続する手段を提供します.置換テキストのパラメータが##に隣接している場合、そのパラメータは実際のパラメータに置き換えられ、前後の空白文字が削除されます.置換後の結果を再スキャンします.次のようになります.
    #define paste(front, back) front ## back
    

    したがって、マクロがpaste(name,1)を呼び出した結果、記号name 1が確立される.
    4.11.3条件は次のとおりです.
    条件文を使用して、前処理自体を制御することもできます.この条件文の値は、前処理実行中に計算されます.この方法は、計算された条件値に基づいてコンパイル中に異なるコードを含む選択的な手段を提供する.
    #if文は、sizeof、タイプ変換子、enum定数を含むことができない定数整数式を評価します.式の値が0でない場合は、#endif、#elif、または#else文に遭遇するまで、その後の各行を含みます(プリプロセッサ文#elifはelse ifに似ています).#if文では、名前が定義されている場合に1の値を持つ式defined(名前)を使用できます.それ以外の場合、値は0です.
    C言語は、名前が定義されているかどうかをテストするために使用される2つのプリプロセッサ文ifdefとifndefを特別に定義します.
    まとめ
    この章はやっと終わりました.プリプロセッサの段階ではよく分からないかもしれませんが、後期は実践の中で注意しなければなりません.本書のこの部分の翻訳、あるいは構造の手配は少し問題があるような気がします...少なくとも私は読めなくて、気絶しました(大神無視).この部分は私たちの後続の学習に影響を与えず、後で深く研究する機会があります.次の章では、C言語で最も難しいポインタと配列に触れ始めます.ポインタと配列を学んで、基本的にC言語の基礎知識の学習を終えて、基礎知識を熟練して掌握した後に、私達は相応の深い研究と実践の練習を行います.