C++前処理まとめ、系統的な学習心得


プリプロセッシング
  • パラメータなしマクロ定義
  • パラメータ付きマクロ
  • #include文の使い方
  • 条件コンパイルコマンドの使用
  • #pragma
  • #line
  • #undef
  • #ifdef#ifndef
  • #if


  • パラメータなしのマクロ定義
    #define PI 3.14

    #
    これが前処理コマンドであることを示します
    PI
    マクロ名、識別子
    3.14
    マクロ名に代わる真の値である文字列
    *プリプロセッシングのコンパイルでは、PIに遭遇するたびに自動的に3.14に置き換えられます.*注意:プログラムに表示される文字列にマクロ名が含まれている場合は置き換えません*マクロ定義の役割ドメインをundefで終了できます
    #define TEST "test"
    int main()
    {
        printf(TEST);
    #undef TEST
    }

    パラメータ付きマクロ定義
  • 例えば
  • #define MAX(a,b) ((a>b)?(a):(b))
  • パラメトリックマクロ定義特徴点:
  • (利点)単純関数はパラメトリックマクロで定義され、関数呼び出しは存在せず、コード実行速度
  • を増加させることができる.
  • (欠点)タイプチェックはできません関数ではないので
  • (注意)かっこ、かっこ、かっこ、重要なことを3回話します.


  • #includeコマンド
    #include "stdio.h"
    #include 
  • 上の2つの方法は違いがありますか?
  • <>を使用して、c/c++ライブラリ関数ヘッダファイルを格納するディレクトリに含めるヘッダファイルを探します.
  • は「」を使用して、まず現在のディレクトリに含めるヘッダファイルを探します.これ以上上のように探しに行かなかった.
  • 「」は、絶対パスおよび相対パス
  • を使用することができる.
  • ここではヘッダファイルについてですが、ヘッダファイルにはどんな内容が入っていますか?
  • マクロ定義
  • 構造体、連合、列挙
  • typedef宣言
  • 外部関数
  • グローバル変数
  • 注意すべき点:
  • includeにはヘッダファイル
  • しか含まれません.
  • ファイルにはネスト可能なものが含まれ、1つの含まれるファイルには別のファイル
  • も含まれる.
  • あるファイルに別のファイルが含まれている場合、コンパイル後は1つのファイルとなり、2つのファイルのグローバル静的変数は共通であり、externで宣言する必要はありません.



  • じょうけんコンパイル
    #if      
           
    #endif
  • 定数式が真である場合、文ブロック
  • がコンパイルされる
    int main()
    {
        int NUM=40;
        int i = 0;
        #if NUM>20
            i++;
        #endif      
    }
  • にはelse分岐もあり、if else
  • と同様に使用することができる.
    int main()
    {
        int NUM=40;
        int i = 0;
        #if NUM>20
            i++;
        #else
            i--;
        #endif      
    }
    
    int main()
    {
        int NUM=40;
        int i = 0;
        #if NUM>20
            i++;
        #elif NUM>10
            i--;
        #elif NUM>0
            i+=2;
        #endif      
    }
  • 個人的にはあまり使われていないような気がしますが、以下はよく使われています~
  • #ifdefおよび#ifndefコマンド
  • の前の#ifコマンドは、符号定数で定義された具体的な値を判断する必要があるが、具体的な値を判断する必要がなく、符号が定義されているかどうかを知る必要がある場合がある.

  • #ifdef USE_TEST_DLL
           1
    #else
           2
    #endif
    //     USE_TEST_DLL,      1;  ,     2.
    
  • #ifndefと類似
  • 実際の開発では、ヘッダファイルが
  • を含むことを防止するために、このような使い方がしばしば遭遇する.
    #ifndef _TEST_ADD_H_
    #define _TEST_ADD_H_
    #else
        ...
    #endif
  • #line
  • LINEとFILEの内容を変更するために使用され、主にデバッグに使用され、言わないでください.

  • #pragmaコマンド
  • は、コンパイラの状態を設定、または、コンパイラに特定の動作
  • の完了を指示する役割を果たす.
  • の後に続くパラメータ:
  • message:コンパイル情報出力ウィンドウに対応する情報
  • を出力する.
  • code_seg:プログラムに関数コードが格納されているコードセグメントを設定します.
  • once:ヘッダファイルがコンパイルされることを保証します.ヘッダファイルの最初の行はpragma once
  • です.
  • これは上の#ifndef機能と似ていますか?彼らにはいくつかの違いがあります.しかし、私が言いたいのは、上の#ifndef方式はc++標準サポート方式で、コードのプラットフォーム移植に便利です.これは、コンパイラサポートの、移植コードは顔次第です.**

  • 小记:この文章は私がc++プログラミング実戦(清华大学出版社)を见て整理したもので、上记の间违いがあるところを指摘してください.