• ベストアンサー

Cの最初の行に

#ifndef PQFORMAT_H #define PQFORMAT_H のようなものがあったりしますが #define PQFORMAT_Hで変数PQFORMAT_Hに何も割り当てていません このようなマクロはどういう時に使うのでしょうか? PQFORMAT_Hは一例で一般の変数と考えてください 何も割り当てない#defineの使い道を教えてください よろしくお願いします

質問者が選んだベストアンサー

  • ベストアンサー
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.4

まず #define PQFORMAT_H ではPQFORMAT_Hを空文字列であるとマクロ定義することになります。 何も割り当てていないのではなく空文字列を割り当てているのです。 なお #ifndef PQFORMAT_H #define PQFORMAT_H // ここにpqformat.hの記述 #endif はヘッダファイルを一度だけ読み込むためのイディオムで、現在コンパイルしているCプログラムで初めてpqformat.hを読み込んだときだけ宣言を処理するようにします。 既に回答があるように、ここではPQFORMAT_Hがマクロ定義されているか否かが重要なのであって何を割り当てているかは重要ではありません。二回目にpqformat.hを読み込むとPQFORMAT_Hが既にマクロ定義されているので#ifndef~#endifが削除されるのです。 上記イディオムでやりたいことは最近のVisual C++では #pragma once と書いても実現できますね。 pragmaを使うと移植性が悪くなりますが。

reiman
質問者

お礼

ありがとうございました よくわかりました

その他の回答 (3)

  • hashioogi
  • ベストアンサー率25% (102/404)
回答No.3

私が以前他人のソフトを解析していた時に見た使用例の紹介です。 まず #define INPUT #define OUTPUT と定義した上で、 void func (INPUT int a, OUTPUT int *b) { : : } のようになっていました。 変数aは関数の入力、変数bは関数の出力ということがなんとなくわかります。 一見c言語の文法に合っていないように思われますが、翻訳時にプリプロセサが void func (int a, int *b) { : : } にしてから翻訳しますので問題はありません。

reiman
質問者

お礼

中身の無いマクロ変数も使い道が有るのですね 参考になりました ありがとうございました

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

まず、「マクロ」と「変数」は性質がまったく違うものですので、混同しないようにしましょう。 マクロや#で始まる命令の処理は、コンパイルの前にプリプロセッサで行われます。コンパイルされるのは、処理済みのソースです。 例えば #define A 10 int a=A ; だったら、実際にコンパイルされるのは int a=10 ; というプログラムです。 #if ~#elif ~ #else ~ #endif は、条件が成立つ箇所だけを残し、それ以外は「無かったこと」にされます。条件に使えるのは、定数やマクロで、変数は使えません。 #define A 10 #if A==1 printfff("1\n") ; #elif A==10 printf("10\n") ; #else printffff("else\n"); #endif だったら、#elif A==10 が成立するので、実際にコンパイルされるプログラムは printf("10\n") ; となります。通常のif文と違うのは、成立していない箇所を完全に消してしまうことです。通常のif文では、通常はprintfffなんて定義してないので、コンパイルエラーになります。 この条件には defined(MACRO) というものもあって、これはMACROマクロが定義されていたら真になります。 #ifndef ~ は #if !defined(~) の省略で、マクロ~が定義されていなかったら、となります。 判定条件は「定義されているかどうか」なので、その中身は関係ありません。なので #define PQFORMAT_H という定義だけで中身は空、というものも使います。

reiman
質問者

お礼

ありがとうございます わざわざマクロの説明をしていただいて恐縮ですが なぜマクロで空の変数を定義するのかが質問です 質問が不適切で余計な手間をとらせていただいて申し訳有りませんでした

  • lv4u
  • ベストアンサー率27% (1862/6715)
回答No.1

>>このようなマクロはどういう時に使うのでしょうか? やや大きなプログラムですと、includeしたファイルの中に、同じファイルのincludeが複数回記述されていることがあります。 そのままだと、場合によっては、同じファイルを複数回読むことになりますが、それでは2重定義、3重定義をすることになります。 なので、#ifndef を使って、それ以下の行について、処理するかしないか?をコントロールして、多重定義とならないようにしています。

reiman
質問者

お礼

詳しい説明有難うございました

関連するQ&A

専門家に質問してみよう