C言語関係掲示板

過去ログ

No.307.#IFとか#IFDEF?

[戻る] [ホームページ]

No.1844

#IFとか#IFDEF?
投稿者---k49(2002/06/27 10:57:27)


の使い方が解りません。コンパイルをしたりしなかったりするのでしょうか?詳しく教えてください。

No.1872

Re:#IFとか#IFDEF?
投稿者---kikk(2002/06/28 17:24:45)


ども。


>の使い方が解りません。コンパイルをしたりしなかったりするのでしょうか?詳しく教えてください。

はい、コンパイルをしなかったりします。
ちなみに小文字です。

#ifや#ifdefや#ifndefは#elseや#elifや#elseまでの間のコードを有効に
したり無効にしたりします。式に指定できるのは定数式のみです。
それぞれの詳細はマニュアルのプリプロセッサの項目をあたってください。
ここでは使用例をいくつか挙げておきます。


例1

#if 0
code
#endif

codeの部分をコンパイルしません。/**/よりも便利な点として、ネスト
可能、コードをコメントイン/アウトするのが簡単(特にコードが長いとき)等
があります。


例2

#ifdef symbol
code
#endif

#define symbolとされているときにcodeが有効になります。#define symbol
は自分で書く場合もありますが、それよりも、コンパイラがデフォルトで
#defineしている、システムに関係のあるシンボルを利用することが
けっこうあります。それをつかって、システムに固有のコードをONに
したりして、移植性の高いコードを書くことができます。例えば、
Windows系のコンパイラでは_WIN32が定義されています。


例3

#ifndef MODULE_H
#define NODULE_H
code
#endif /*module.h*/

多分知らないうちに使っているのがこれ。ヘッダファイルはまずこうなって
います。codeにはヘッダファイルの本体すべてが書かれます。これの効果は
複数回#includeされても実際に有効なのは最初の1回のみになります。実際
に、stdio.h等のヘッダをみて確認してみてください。


以下は規格で決まっているわけではないけど、大抵の処理系で使える方法。
詳細はマニュアルを。

コンパイラのオプションで、プリプロセッサだけを走らせるものがたぶん
あります。また、プリプロセッサ単体を直接起動することもできるかも
しれません。

コンパイル時に、コード中に#define symbolと書いてあるのとおなじように
扱ってくれるオプション(たぶん-Dsymbol)がたいていあります。これと上記
例2を組み合わせると、***ソースに手を加えることなく***コメントイン/
アウトができたり、定義されているべきシンボルが定義されていない場合に
調節したりできます。また、#define a bのタイプの定義もたぶんできますが
これも例1と組み合わせると便利なことがあるかもしれません。


いま思いついたのはこれくらいです。処理系のヘッダファイルを見ても
いくつかの手法が見つかります(Windowsの処理系で、WindowsやIEの
バージョンで処理を分けてたり)。また、ベクターあたりで適当な
プログラムのソース(移植性が高そうなキャラクタベースのがよいかと)
を拾ってきてながめてもいろいろわかると思います。


では。