必要なifndef、endifマクロ定義

3506 ワード

まず、最初からファイルを始めましょう.多くのヘッダファイルでは、このような文が表示されます.
#ifndef _MYHEADFILE_H  
#define _MYHEADFILE_H
// .......  ......
#endif // _MYHEADFILE_H

同じファイルがinclude回以上になるのを避けるために、#ifndefを用いて判断することが多く、_MYHEADFILE_Hが含まれていない場合、#defineを用いてマクロ_MYHEADFILE_Hを定義し、#endif#ifndefの首尾に呼応し、終了を示す.
ここでは、コンパイル前にCプログラムを処理することができる小さなソフトウェアであるC言語のプリプロセッサを提案する必要があります.その動作は、プリプロセッサ命令によって制御され、プリプロセッサ命令には以下の内容が含まれています.
  • マクロ定義#define
  • ファイルは#include
  • を含む.
  • 条件コンパイル#if
  • #ifdef
  • #ifndef #if defined #if !defined #elif #else #endif #undef
    命令はすべて#で始まる
    簡単なマクロ定義(オブジェクトマクロ)を見てみましょう#define標準記号置換リスト#define PI 3.1415926
    タイプの名前を変更できます#define BOOL int
    マクロはパラメータを持つことができ、よく言われるマクロ関数でもある.#define識別子(x 1,x 2...)置換リスト
    特に、識別子と(スペースは使用できませんが、カッコは必須です.
    例を見てみましょう
      #define MAX(x,y) ((x)>(y)?(x):(y))
      #define IS_EVEN(n) ((n)%2==0)
      #define TOUPPER(c) (‘a’

    さらに複雑に書くこともできます.例えば、マクロ関数を書いて、日付が合法かどうかを検証します.
      #define ISLEAP(y) ((y)%4==0&&(y)%100!=0||(y)%400==0)
      #define ISSMALL(m) ((m)==4||(m)==6||(m)==9||(m)==11)
      #define NORMAL(m) (ISSMALL(m)?30:31)
      #define DAYS(y,m) ((m)==2?28+ISLEAP(y):NORMAL(m))
      #define IN(x, from,to) ((x)>=(from)&&(x)<=(to))
      #define VALID(y,m,d) ((y)>1600&&IN(m,1,12)&&IN(d,1,DAYS(y,m)))
    

    条件コンパイルを見てみましょう
    #if (comdition)
    {//  ##;}
    #endif
    
    

    (comdition)が真、すなわち論理1であれば、次の文をコンパイルし、(comdition)が偽、すなわち論理0であれば、次の文をコンパイルしない.例は以下の通りである.
      #define DEBUG
      #if DEBUG
      Printf(“Value of i:%d
    ”, i);   Printf(“Value of j:%d
    ”, j);   #endif

    フォーマット:#if定数式
    定数式が0の場合、プリプロセッサは#if#endifの間のコードを削除します.#ifは定義されていない標準文字を0と見なし、DEBUGが定義されていなければテスト#if DEBUGは失敗しますが、#if !DEBUGは成功します.
    マクロを使用してファイル名を定義できます.
      #if define(IA32)
      #define CPU_FILE “ia32.h”
      #elif defined(IA64)
      #deifine CPU_FILE “ia64.h”
      #elif defined(AMD64)
      #define CPU_FILE “amd64.h”
      #endif
      #include CPU_FILE
    

    定義済みマクロをキャンセルすることもできます.
      #if defined VALUE              //   VALUE      ,     
      #undef VALUE                   //       
      #define VALUE 1000             //      VALUE  1000
      #endif
              ,     :
      #ifndef VALUE                 //   VALUE     
      #define VALUE 1000            //    VALUE  1000
      #endif
    

    以上で使用したマクロのうち:#undefは解除定義である.#ifndefif not definedの略であり、#if !definedと書くこともできる.#ifdefif definedの略であり、#if definedと書くこともでき、定義されているかどうかを確認することもできる.#ifdef#if definedの違い、#ifndef#if !definedの違いは類似しており、いずれも後者が複雑なプリコンパイル条件を構成することができ、前者は単一マクロが定義されているかどうかを判断するだけであり、例えば:
      #if defined(PERL_PACK_CAN_SHRIEKSIGN)
      /* v */ SIZE16,
      #else
      0,
      #endif
      #ifdef PERL_PACK_CAN_SHRIEKSIGN
      /* v */ SIZE16,
      #else
      0,
      #endif
      #ifdef    ,           。
      #ifdef HAVE_MYHEADER
      # if VERSION > 3
      ...
      # endif
      #endif
           
      #if defined(HAVE_MYHEADER) && VERSION > 3
      ...
      #endif