掲示板ランキング  レギュラー(グァテマラ)  レギュラー(ブラジル)  レギュラー(ハワイコナ)


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.7354

ifと#ifの使い分け方を知りたいです。
投稿者---みのり(2007/04/14 01:29:04)


はじめまして、みのりと申します。こんばんは。

C言語を勉強しています。プリプロセッサのところでつまづきました。
文法はわかるのですが、利用の利点がわかりません。
前処理自体わかっていないかもしれませんが、具体的に、
if と #if の使い分けがわかりません。他にも例えば
#ifdef DEBUG
  printf("Debug");
#endif
といった、DEBUGが定義されていればDebugを表示するという流れは
わかりますが、ソースを追いかけて見れば、DEBUGが実際定義されているかはわかると思います。 
 
また、ヘッダファイルによく#〜を使った記載を見ます。
#define macro 1 ならマクロ置換で、macroがでる度に置き換えれると
わかりますが、#ifdef DEBUG のように記載されていれば、
いつこの#ifdefが実行されるのかが知りたいです。

お手数ですが、よろしくお願いします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ifと#ifの使い分け方を知りたいです。 7355 si 2007/04/14 02:31:26


No.7355

Re:ifと#ifの使い分け方を知りたいです。
投稿者---si(2007/04/14 02:31:26)


>#ifdef DEBUG のように記載されていれば、
>いつこの#ifdefが実行されるのかが知りたいです。
例 debug.c
#include <stdio.h>
int main(void)
{
#ifdef DEBUG
    printf("Debug\n");
#endif
    printf("何か\n");
    return 0;
}
コンパイル&実行
$ gcc debug.c -o nodebug
$ ./nodebug
何か
$ gcc debug.c -o debug -D DEBUG
$ ./debug
Debug
何か




この投稿にコメントする

削除パスワード

No.7356

ヘッダではどうなりますか?→Re:ifと#ifの使い分け方を知りたいです。
投稿者---みのり(2007/04/15 00:08:57)


siさん、早速のレスありがとうございます。

その例をみますと、コンパイルするときに定義するかどうかで
結果が変わるこということですね。
差し支えなけれはですが、
具体的にどういった場面でこの方法を利用されますか?

main関数内に書かれていれば、流れはわかります。
ヘッダファイル内に#ifdefで記載されていたら、
どのときに影響されるか途端にわかりません。

なお、申しおくれましたが、私が使っている環境は、
WindowsXP(sp2)でVisualStudio2005アカデミック版です。

よろしくお願いします。

>>#ifdef DEBUG のように記載されていれば、
>いつこの#ifdefが実行されるのかが知りたいです。
例 debug.c
#include <stdio.h>
int main(void)
{
#ifdef DEBUG
printf("Debug\n");
#endif
printf("何か\n");
return 0;
}
コンパイル&実行
$ gcc debug.c -o nodebug
$ ./nodebug
何か
$ gcc debug.c -o debug -D DEBUG
$ ./debug
Debug
何か



この投稿にコメントする

削除パスワード

No.7357

Re:ヘッダではどうなりますか?→Re:ifと#ifの使い分け方を知りたいです。
投稿者---YuO(2007/04/15 00:16:00)


>main関数内に書かれていれば、流れはわかります。
>ヘッダファイル内に#ifdefで記載されていたら、
>どのときに影響されるか途端にわかりません。

関数内だろうがヘッダファイル内だろうが#ifに関係ありません。
# というか,プリプロセッサは関数を認識しない
前処理指令はコンパイルより前に処理され,コンパイルされるソースコードを改変します。



この投稿にコメントする

削除パスワード

No.7358

ヘッダではどうなりますか?→Re:ifと#ifの使い分け方を知りたいです。
投稿者---bugs(2007/04/15 08:30:02)


> 具体的にどういった場面でこの方法を利用されますか?

例示のとおり、デバッグ用のコードを埋め込むときなどに使います。
デバッグ時はコンパイル・オプションで-DDEBUGを指定して、
リリース時は-DDEBUGを指定しないようにします。

そうすると、コード自体を変えずに、コンパイル・オプションを
切り替えるだけでデバッグ用・リリース用の各々の実行ファイルを
作ることができます。


この投稿にコメントする

削除パスワード

No.7380

では#ifはいつ使いますか?→Re:ifと#ifの使い分け方を知りたいです。
投稿者---みのり(2007/04/23 23:11:35)


お礼が遅れました。本当に申し訳ございません。 
 
YuOさん、bugsさん、ご指導ありがとうございます。 
図書館で本やインターネットで使い方を調べました。 
例え、プリプロセッサをヘッダ内に書いてもmain内に書いても
前処理をされるということですね。
 
それでも疑問に思います。
ifと#ifの使い分けが…よくわかりません。
 
#ifdefについてはコンパイルオプションで切り替える
ということはわかりました。定義しているかしてないかで変わるということですよね。

#ifはifか#ifdefで書けるんじゃないかなって思いました。
ifではなく#ifを使わないといけない例が知りたいです。
#ifはこういうときに使うという例があればと思います。 
 
お手数をおかけしますが、何卒よろしくお願いします。


この投稿にコメントする

削除パスワード

No.7381

Re:では#ifはいつ使いますか?→Re:ifと#ifの使い分け方を知りたいです。
投稿者---bugs(2007/04/24 00:16:43)


ヘッダーファイルを自作する際、二重インクルードによるエラーを
防ぐため、例えばこんな風に書きます。
#if !defined(__HOGE__)
#define __HOGE__

/* ヘッダーファイルの実際の内容をここに書く */

#endif

このヘッダーファイルを仮にhoge.hとすると、hoge.hを最初に
インクルードしたときに__HOGE__が定義されます。
hoge.hを二回目以降インクルードする際は、__HOGE__は定義済みなので、
ヘッダーファイルの実際の内容を二重にインクルードすることはありません。

これをすべてのヘッダーファイルについて首尾一貫して行なえば、
ヘッダーファイルの中で他のヘッダーファイルをインクルードするような
ことがあっても、二重インクルードが防げます。

お使いの処理系のヘッダーファイルをエディタか何かで開いてみてください
(念のためですが、閉じる際に「保存」してはいけません)。
きっと、上に述べたようなことをしてあるはずです。


この投稿にコメントする

削除パスワード

No.7382

Re:では#ifはいつ使いますか?→Re:ifと#ifの使い分け方を知りたいです。
投稿者---bugs(2007/04/24 09:27:38)


もしかすると、処理系によって、同じ機能を持つ関数名が異なることが
あるかもしれません(実際にそういうことがあるかどうかは未調査です)。

仮にそういうことがあるとして、処理系独自の定数が定義してあるとすると、例えば
#if defined(BCC)             /* Borland C++ Compilerの場合 */
    function_for_borland();
#else                        /* Borland C++ Compiler以外の場合 */
    function_for_other();
#endif

のようにすることで、処理系による違いをある程度吸収できると思います。

なお、「BCC」はあくまで例であり、Borland C++ Compiler独自の定数として
どういうものがあるかは未調査です。ご了承ください。


この投稿にコメントする

削除パスワード

No.7383

Re:では#ifはいつ使いますか?→Re:ifと#ifの使い分け方を知りたいです。
投稿者---YuO(2007/04/24 10:50:21)


>#ifはifか#ifdefで書けるんじゃないかなって思いました。
>ifではなく#ifを使わないといけない例が知りたいです。
>#ifはこういうときに使うという例があればと思います。 

#ifdefは#ifで書けます。
#ifは代替手段がありません。

特定のコンパイラの特定のバージョンにおけるバグを回避する場合や,
特定のコンパイラの特定のバージョン以降に同等の機能が追加されている場合に,#ifは重宝します。
#if defined(_MSC_VER) && _MSC_VER < 1310
// VC++ 6.0以下およびVC++.NET用の実装
#else
// 規格書に沿った実装
#endif

のような使い方ができます。

MicrosoftのC/C++コンパイラは,_MSC_VER前処理定数を自動的に定義します。
そして,その値としてバージョン番号を設定してくれます。
それを利用して,コンパイラの機能によってコードを振り分ける,などということがなされています。
これは#ifdefでは対応できませんし,ifでは最悪多重定義でコンパイルエラーになります。



この投稿にコメントする

削除パスワード

No.7422

Re:では#ifはいつ使いますか?→Re:ifと#ifの使い分け方を知りたいです。
投稿者---みのり(2007/05/08 00:07:17)


お礼が大変遅くなりました。申し訳ございません。 
 
bugsさん、YuOさん、ご指導本当にありがとうございます。
実際プログラムを組んで実行してみました。ごく簡単なものですけど。
使い方をやっと実感できたのでとてもうれしいです。

図書館でいろいろC言語の本を見ましたが、やはり文法的な説明だけで、
どういう場面で利用されているのか全くわかりませんでした。
教えていただいたことが教科書に載っていたらいいのに。

bugsさん、YuOさんが仰った内容は思いもしなかったことでしたが、
プログラムを組んでいく上で注意すべき事柄と思います。
今まで全く気にしたことがなかったので。
ありがとうございました。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧





掲示板提供:(有)リアル・インテグリティ