• ベストアンサー

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

  • C言語の#defineについて

    初歩的なことですみませんが、 #define命令はソースのどこに記述しても問題ありませんか? 一応、コンパイル時には問題ないようですが。 また、#ifdef,#ifndef,#elseifとうのマクロ全般においてはどうなのですか? どなたか教えていただけませんか?

  • C初心者です

    学校でC言語を習い始めたばかりの初心者です。以下のプログラムを作成したいのですが、お教え願います。ちなみに授業では整数型の変数を定義してなんちゃらとか、printfというところまでしかやってません。 1、5人の身長の平均を求めるプログラム(小数点以下切捨て) 2、1の人数5に対してNUMBERというマクロ名を与え、プログラムを書き換えよ。(#defineで定義とか言うひヒントがかいてありました) 3、#defineによるマクロ名を使うメリットは何か? という3つです。 1は変数を5個定義してやればいいんですかね?それを全部足して5で割って…、でいいんでしょうか? 2,3はまったく分かりません。 かなり簡単な質問かとは思いますが、なにぶん始めたばかりなものなので、お教え願います。 できたらプログラムリストを示していただきたいです。 宜しくお願い致します。

  • (msvcr71d.dll) でハンドルされていない例外が発生しました

    Visual C++ を勉強しだした Windowsプログラム初心者です。 ある参考書のサンプルで、メールスロットを利用したメッセッンジャー体験プログラムがあります。 このプログラム一つで、クライアントとサーバーを実感する為のもので、ダイアログボックスだけで出来ています。 デバック実行で、画像にある[送信]ボタンを押すと、 「Mailslot.exe の 0x1021471c (msvcr71d.dll) でハンドルされていない例外が発生しました : 0xC0000005: 場所 0x00000015 を読み込み中にアクセス違反が発生しました。 。」 とエラーボックスが出ます。 原因は パソコンのOSのバージョンなのか、何か足りないライブラリなのか?切り分け所がわからなくて困っています。 どなたか良いアドバイスをお願いします。 OS : Vista Home Premium IDE: Visual C++.net スタンダード version 2003 因みに、stdafx.h の内容は↓です。 #pragma once #ifndef VC_EXTRALEAN #define VC_EXTRALEAN #endif #ifndef WINVER #define WINVER 0x0501 #endif #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0400 #endif #ifndef _WIN32_WINDOWS #define _WIN32_WINDOWS 0x0410 #endif #ifndef _WIN32_IE #define _WIN32_IE 0x0400 #endif #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 一般的で無視しても安全な MFC の警告メッセージの一部の非表示を解除します。 #define _AFX_ALL_WARNINGS #include <afxwin.h> #include <afxext.h> #include <afxdisp.h> #include <afxdtctl.h> #ifndef _AFX_NO_AFXCMN_SUPPORT #include <afxcmn.h> #endif #include <Lmcons.h>

  • 2重定義って??

    C言語のプログラミングの勉強をしています。 そこで2重定義というものを知り調べたのですが、良く分かりませんでした。コンパイルの仕組みなども併せて教えてください。お願いいたします。 恐れ入りますが、どなたか初心者にも分かる位のレベルで教えて頂けますでしょうか? 簡単な例があると助かります。 不明点 ・2重定義とは例えば1つの*.hを2つ以上の*.cでインクルードする場合にのみ有効なのか? 自分で調べた結果 2重定義防止用として #ifndef HOGE #define HOGE ~~~~~~~~ #endif 上記のようなことを一般的には行うことは分かったのですが、 これをやったことでどうなるのか??

  • #ifndefとかヘッダファイルについて

    http://www.geocities.co.jp/SiliconValley/6071/technic/16.html に書いてあることで質問です。 /* myheader.h */ #ifndef __myheader_H__ #define __myheader_H__ : : : #endif と記述されているのですが、ここの「#define __myheader_H__ 」というのは、myheader.hをインクルードしているという意味になるのでしょうか? あと、ifndef等でヘッダファイルが読み込まれているか判定する際には、コンマをアンダーバー(アンダースコア)に変えるという作業は必ずいるようですが、いろんな所を調べてみると、例えば、myheader.hについて判定する場合は、 __myheader_H__ myheader_H _myheader_H _MYHEADER_H 等、アンダースコアが先頭と最後に2個付いていたり、先頭に1個だけだったり、全部大文字にしていたりと、様々なものがあるのですが、これはどの様な表記を使えばいいのでしょうか?

  • 条件付き取り込み

    C のヘッダーファイルでは、条件付き取り込みとして、 #ifndef SAMPLE #define SAMPLE /* sample.hの内容をここに書く */ #endif のように書くのが定石のようですが、これが無いと、具体的にどういう場合に不具合が出るのでしょうか。

  • インクルードガードの命名の仕方

    質問です。 インクルードガードの際、インクルードガード名は自由に設定できるのでしょうか。 例えばheader.h内で以下のように設定します。 #ifndef COMMON_HEADER_H #define COMMON_HEADER_H このとき、COMMON_HEADER_Hはheader.hを指しますか。

  • c#のマクロ定義について

    C言語でマクロ定義の場合以下のようにヘッダファイルに#defineで定義しますが、C#の場合どのようにすればいいのでしょうか。 C言語の場合 *** test.h *** #define TEST 5 C#の場合 public const int TEST = 5; //これでいいの? 専用のclassを用意するの? 初歩的な質問ですが宜しくお願い致します。

  • 分割コンパイルの初歩

    C言語ですが、.hに実装を書くのは避けたほうが良いといわれます。 私は main.c define.h aaa.h bbb.h みたいなスタイルでコードを書いていました。 まずdefine.hでグローバル変数や、マクロなどの宣言を まとめて行い、ほかの.hやmain.cでも使えるようにして いました。 しかし、以下のような状況のとき、どのように分割すれば 良いのかが分かりません・・・。 たとえば、以下のように、マクロNUM、変数a,bをすべてのファイルで共有して使えるように分割コンパイルするにはどのようにコードを書き直せば良いのでしょうか? //--------------main.c------------------ #include "define.h" #include "aaa.h" #include "bbb.h" int main( void ){   printf("%d", a);   printf("%d", b);   printf("%d", NUM);   aaa();   bbb();   return 0; } //------------define.h------------------ #define NUM 100 int a = 10; int b = 20; void aaa( void ); void bbb( void ); //------------aaa.h------------------ void aaa( void ){   printf("%d", a);   printf("%d", b);   printf("%d", NUM); } //------------bbb.h------------------ void bbb( void ){   printf("%d", a);   printf("%d", b);   printf("%d", NUM); }

  • 数値が 2 のべき乗かどうか調べるマクロ

    define した値や変数値が、2 のべき乗かどうかを 関数ではなくマクロで簡単に評価できる方法はありますか。 例) #define BUFFERSIZE (2048) // OK //#define BUFFERSIZE (2000) // NG #if !(BUFFERSIZE が 2 のべき乗か調べるマクロ/評価式) # error コンパイルエラーメッセージ #endif assert(BUFFERSIZE が 2 のべき乗か調べるマクロ/評価式); buffer[idx] = data; if (BUFFERSIZE が 2 のべき乗か調べる) idx = ++idx & (BUFFERSIZE - 1); else { idx = ++idx % BUFFERSIZE; // idx = (idx + 1) >= BUFFERSIZE ? 0 : (idx + 1); } 上記の、日本語で書いてる部分を満たすマクロ (関数ではなく) は どういうふうにすればいいでしょうか。 よろしくお願いします。

このQ&Aのポイント
  • ThinkBookのハードウェアの不具合で、スマートセンターに問い合わせをしていますが、何も連絡がこないまま、サービスリクエストが受付されたと同時刻にキャンセルになっています。
  • 開始日から終了日までのサービスリクエストのフローがすべて同日の同時刻で進んでおり、スマートセンターからの返事もありません。
  • Lenovoのノートブックに関する問題で、サービスリクエストの受付後すぐにキャンセルされています。
回答を見る