C Macros sample
#define ThisServerIsSS
#ifdef ThisServerIsSS
//SS only code
#else
//SSM only code
#endif
#ifndef _LOG_H_
#define _LOG_H_
int ReadLog();
#endif //_LOG_H_
#ifdef CheckAll
InitGlobal();
ProcessNicTraficInfo();
ProcessDelayCount();
#else
CheckMySelf();
#endif
from https://www.grapecity.com/tools/support/powernews/column/clang/014/page02.htm
主なプリプロセッサ指令
主要なヘッダファイル※2 は、#で始まるプリプロセッサ指令の集合』であると言えます。主なプリプロセッサ指令を紹介しておきましょう。#include
- 機能 :
- ファイルを取り込む
- 書式 :
- #include <ファイル名>
- 詳細 :
- <ファイル名>で示されたファイルを取り込みます。ファイル名を<>で囲むと、設定ファイルなどで予め指定された、処理系のヘッダファイルを保存しているディレクトリ(フォルダ)からファイルを探します。それ以外の場所にあるファイルを取り込みたい場合には、ファイル名を""で囲みます。
ファイル名を""で囲んだ場合、通常はファイルのフルパスを記述します。パスを省略してファイル名だけを記述すると、現在処理しているソースファイルと同じディレクトリからファイルを探します。
#define
- 機能 :
- 文字列の置き換え
- 書式 :
- #define <文字列1> <文字列2>
- 詳細 :
- 識別子<文字列1>を値<文字列2>と定義します。先に“<識別子名> <値>”という書式を紹介しましたが、実際には#defineは文字列同士の置き換えを行っています。なぜなら、プリプロセッサ指令はあくまでソースファイルに記述された文字列(ソースコード)を扱っているに過ぎないからです。
とすれば、コンパイルの段階では"__MAX"という記号が整数(int型)の100に置き換えられますが、ソースコード上では文字列の"__MAX"が"100"という文字列に置き換えられています。
プリプロセッサ指令は、あくまでも『文字の集合であるソースコード上で機能する命令』です。
#undef
- 機能 :
- #defineによる文字列置き換えの取り消し
- 書式 :
- #undef <識別子名>
- 機能 :
- #defineで定義された識別子と値の置き換えを無効にします。この指令以降、<識別子名>の値は未定義を示す0になります。
#ifdef
- 機能 :
- 識別子が定義されているかどうかの判定
- 書式 :
- #ifdef <識別子名>
<処理> - 詳細 :
- <識別子名>が定義済みなら<処理>を実行します。<処理>はプリプロセッサに対する指令です。識別子は#defineで値を定義しますが、未定義の場合は0となっています。従って#define指令では、識別子を0以外の値に定義する必要があります。
<処理>が複数行にわたる場合は、処理ブロックの最後を示すために#endifを記述します。
#ifndef
- 機能 :
- 識別子が定義されていないかどうかの判定
- 書式 :
- #ifndef <識別子名>
<処理> - 詳細 :
- <識別子名>が未定義なら<処理>を実行します。
<処理>が複数行にわたる場合は、処理ブロックの最後を示すために#endifを記述します。
#endif
- 機能 :
- #ifdef、#ifndefなどによる処理ブロックの最後を明示
- 詳細 :
- #ifdef、#ifndef共に結果が「真」なら続く<処理>を1行実行します。複数行の処理を実行させたい場合は、その最後に#endifを記述してブロックの終端を示します。処理の構造を分かりやすくするため、1行の処理の最後に#endifを記述しても構いません。
プリプロセッサの制御構造
ある識別子が定義されているかどうか、または定義されていないかどうかは、上述の#ifdefと#ifndefで判別して処理を分岐できます。しかし、もっと複雑な判定を必要とする場合もあります。例えば、
といった場合です。
そのような場合には、
という構造を使います。意味は一般的なCの構文にあるif~else if~elseと同じですが、ブロックの最後に#endifを記述する必要があります。
#ifによる値の判定
#ifには、続けて識別子が定義済みである(≠0)ことを示す“defined”や、『その識別子が特定の値であるかどうか』を判定するために識別子と値とを続けて記述する書式が使えます。definedでは、続く()内に識別子を記述します。リスト2は
という処理を行います。
また
あるいは
のように#ifに続けて識別子と値とを比較演算子でつなぎ、「ある識別子がある値であれば……」「ある値以下なら……」といった条件判定の構造を作ることもできます。
リスト2:#if~#elif~#elseを使った記号定数の定義
留言
張貼留言