必要なifndef、endifマクロ定義
3506 ワード
まず、最初からファイルを始めましょう.多くのヘッダファイルでは、このような文が表示されます.
同じファイルが
ここでは、コンパイル前にCプログラムを処理することができる小さなソフトウェアであるC言語のプリプロセッサを提案する必要があります.その動作は、プリプロセッサ命令によって制御され、プリプロセッサ命令には以下の内容が含まれています.マクロ定義 ファイルは を含む.条件コンパイル#if
命令はすべて#で始まる
簡単なマクロ定義(オブジェクトマクロ)を見てみましょう
タイプの名前を変更できます
マクロはパラメータを持つことができ、よく言われるマクロ関数でもある.
特に、識別子と(スペースは使用できませんが、カッコは必須です.
例を見てみましょう
さらに複雑に書くこともできます.例えば、マクロ関数を書いて、日付が合法かどうかを検証します.
条件コンパイルを見てみましょう
(comdition)が真、すなわち論理1であれば、次の文をコンパイルし、(comdition)が偽、すなわち論理0であれば、次の文をコンパイルしない.例は以下の通りである.
フォーマット:
定数式が0の場合、プリプロセッサは
マクロを使用してファイル名を定義できます.
定義済みマクロをキャンセルすることもできます.
以上で使用したマクロのうち:
#ifndef _MYHEADFILE_H
#define _MYHEADFILE_H
// ....... ......
#endif // _MYHEADFILE_H
同じファイルが
include
回以上になるのを避けるために、#ifndef
を用いて判断することが多く、_MYHEADFILE_H
が含まれていない場合、#define
を用いてマクロ_MYHEADFILE_H
を定義し、#endif
は#ifndef
の首尾に呼応し、終了を示す.ここでは、コンパイル前にCプログラムを処理することができる小さなソフトウェアであるC言語のプリプロセッサを提案する必要があります.その動作は、プリプロセッサ命令によって制御され、プリプロセッサ命令には以下の内容が含まれています.
#define
#include
#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
は解除定義である.#ifndef
はif not defined
の略であり、#if !defined
と書くこともできる.#ifdef
はif 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