[KOCW韓国産業技術大学朴正民教授]Cプログラミング19強


Part 19プリプロセッサによるファイルのコンパイル


19.1プロセッサ(プリプロセッサ)



プリプロセッサとプリプロセッサ

  • のソースファイルをコンパイルする前に、先に処理しなければならない前処理装置を前処理プログラム、前処理を実行する装置を前処理プログラム
  • と呼ぶ.

    プリプロセッサインジケータ

  • 文字で始まる文をフロントプロセッサインジケータ
  • と呼ぶ.
  • プロセッサは行ごとに1つのインジケータのみを使用するため、インジケータの後にセミコロンは使用されません.
    ex)
  • #include <stdio.h>

    19.2マクロ


    #defineで始まる前処理文をマクロと呼び、マクロはマクロ定数とマクロ関数に大別されます.

    マクロていすう

    #define PI 3.14
    전처리기 지시자/매크로 상수 이름/매크로 상수에 치환되는 값을 지정
  • 整数定数および実数定数、文字列定数、関数名およびデータ型は、マクロ定数
  • として定義することができる.
  • はメンテナンスが容易で、追加の変数やブリッジメモリスペース
  • を必要としません.

    マクロの無効化

    #undef PI
    전처리기 지시자/해제할 매크로 이름
  • マクロは定義すると一致するが、既存のマクロを再定義するにはundef,
  • を用いることもできる.

    マクロ関数

    #define MUL(a, b) a*b
    전처리기 지시자/매크로 함수 이름/함수의 기능
    パラメータを設定するためのマクロ
  • 、例えば
  • 関数
  • は単なる置換であり、実際の関数
  • ではない.
  • 因子に関心のない資料型
  • 関数の本体部分はマクロ関数の置換文で置き換えられるため、
  • より高速である.
  • マクロ関数の内部で自分の
  • を呼び出すことはできません.
  • は、1行または2行の単純な内容として定義する必要がある
  • .
  • パラメータに演算がある場合は、予想される()で処理できないため、()に直接バインドする必要があります.

    #演算子と##演算子

  • 演算子
  • マクロ関数のパラメータを文字列に変換する
  • ##演算子はトークン連結演算子であり、マクロ関数においてトークン連結機能
  • を実行する.
  • プログラミング言語では、タグ(Token)は構文解析の単位(コンパイラが認識する文字または文字列の最小単位)を指し、タグを解析するプログラムを解析器と呼び、タグがコンパイラに含まれる
  • 解析器は、コードを数値、カンマ、演算子、識別子などのタグユニットに分割して、コードの構文を解釈し、その意味
  • を決定する.

    定義済みマクロ



    ex)
    #include <stdio.h>
    int main(void)
    {
        printf("File name: %s \n", __FILE__);
        printf("Row number: %d \n", __LINE__);
        printf("Compilation Date: %s \n", __DATE__);
        printf("Compile time: %s \n", __TIME__); 
    
        return 0;
    }
    
    /*
    File name: 19-10.c 
    Row number: 5 
    Compilation Date: Sep  1 2021 
    Compile time: 18:37:57 
    */

    19.3条件コンパイル


    C言語は異なるオペレーティングシステムで使用されるため、各オペレーティングシステムが提供する標準関数または動作は異なる場合があります.
    この場合,ソースコードを単独で記述することはメンテナンスに不利であり,条件コンパイルにより解決できる.

    #if ~ #endif

    #if(조건식)
    	컴파일 문장
    #endif
  • 条件式は、マクロ定数を比較する演算子、関係演算子、論理演算子などを用いることができる

    #if ~ #else ~ #endif

    #if(조건식)
    	컴파일 문장1
    #else
    	컴파일 문장2
    #endif
  • 条件文ifelseの場合、if文が真の場合、コンパイル文1が実行され、偽の場合、コンパイル文2が実行される

    #if ~ #elif ~ #else ~ #endif

    #if(조건식1)
    	컴파일 문장1
    #elif (조건식2)    
    	컴파일 문장2
    #else
    	컴파일 문장3
    #endif
  • if/else if/else文と同じ
  • #ifdef ~ #endif

    #ifdef 매크로 이름
    	컴파일 문장
    #endif
  • #ifdef:定義する場合、マクロ定数値
  • は定義されず、マクロが定義か否かのみが決定される.

    #ifndef ~ #endif

    #ifndef 매크로 이름
    	컴파일 문장
    #endif
  • #ifndef:マクロが定義されていない場合、コンパイル
  • が実行される.

    19.4ファイル分割コンパイル

  • のソースファイルを複数のファイルに分割することで、生産性が向上し、
  • のメンテナンスが容易になります.
    外部キー
  • を使用して、外部ファイルの変数または関数を参照します.

    19.5静的キーワードへのアクセス禁止

  • 静的キーワード
  • を使用して、外部キーワードがシステムに関連する重要な変数または関数を参照することを防止する

    includeを使用してユーザータイトルファイルを作成する

  • 標準ライブラリ用<>ラップ、カスタムライブラリ用""ラップ
    ex)#include「カスタムライブラリ」
  • ヘッダーファイルの先頭と末尾に#ifndef、#define、および#endifの3つの文を追加し、
  • ヘッダーファイルの重複を回避します.
    Reference
    講座:朴正民、《Cプログラム設計》、KOCW韓国工業技術大学、18強
    教材:朴正民『熱血で話すC言語の本色名授業によるC言語の奇跡』、フリーク(2011)、p 655-699.