none
ヘッダファイルの初めの#If 文内と ファイル名の関係 RRS feed

  • 質問

  • 今見たところ 期待どうりに動作しているのですが
    // ParameterDlg.h: interface of the CParameterDlg class
    の最初に
    #if !defined(AFX_PARAMETERSETDLG_H__98EE37B8_03E9_42EA_A93A_13A9B0375655__INCLUDED_)
    #define AFX_PARAMETERSETDLG_H__98EE37B8_03E9_42EA_A93A_13A9B0375655__INCLUDED_
    とあり、そこに ParameterSetDlgの文字があります
    他のhファイルをみると 該当箇所はみな ヘッダファイル名と同じ文字になっています
    一応動作しているので いじらないでいるのですが 不適切であれば書き換えようとおもうのですがいかがでしょうか
    以前 この ParameterSetDlg.cc とか ParameterSetDlg。h の名前を今はそれぞれ ParameterDlgに直した経緯はあります。
    どのようになおしたかは いま定かでないのですが。
    他にParameterSetDlgの記述はでてきません。
    おかしな質問とお思いでしょうが 不安解消のために どうか助言をお願いします


    2009年10月14日 20:41

回答

  • ちゃんと確認していないので、日本語のドキュメントがあるのかは判りませんが、ヘッダーファイルの先頭にある

    #if !defined(AFX_PARAMETERSETDLG_H__98EE37B8_03E9_42EA_A93A_13A9B0375655__INCLUDED_)
    #define AFX_PARAMETERSETDLG_H__98EE37B8_03E9_42EA_A93A_13A9B0375655__INCLUDED_

    部分はヘッダーファイルの下にある

    #endif

    で一つの意味を持ちます。

    VC++ 6.0 は #pragma once ディレクティブと併用されていたと思いますが、要はコンパイル時に同じヘッダーファイルを二度読み込み、「・・・は既に定義されています」という感じのエラーを出さないようにする為のものです。

    #if !defined(AFX_PARAMETERSETDLG_H__98EE37B8_03E9_42EA_A93A_13A9B0375655__INCLUDED_)

    は次の行にある

    #define AFX_PARAMETERSETDLG_H__98EE37B8_03E9_42EA_A93A_13A9B0375655__INCLUDED_

    と組み合わされて使われ、既に

    AFX_PARAMETERSETDLG_H__98EE37B8_03E9_42EA_A93A_13A9B0375655__INCLUDED_

    が定義されていなければ #if ~ #endif 内が有効になるというものです。

    繰り返しになりますが、これら一連のものはコンパイル時に同じヘッダーが二度読み込まれないようにする為ですので、他の文字列に変えても構いませんが、他のヘッダーファイルと同じ文字列にならないものにして下さい。ただ、MFC が自動で生成したユニークな文字列なので、書き換える事はあまりお勧めしませんが。
    2009年10月15日 8:32

すべての返信

  • #define ディレクティブ #if、#elif、#else、および #endif ディレクティブ をよく読めば、
    この部分が何をしているかがわかると思います。

    そうすると、書き換える必要があるかどうかが分かるようになりますので、不安は解消されます。

    2009年10月15日 0:18
  • 日本語文がみあたらす質問下次第です
    思い出すとか なんとかであれば 英語でも誤解しないと思いますが
    ちょっといじって NGで戻らなくなく経験から 確認したいのです。
    出来たら 他とそろえたいので 書き換えたいのですが いかがでしょうか?

    2009年10月15日 8:16
  • ちゃんと確認していないので、日本語のドキュメントがあるのかは判りませんが、ヘッダーファイルの先頭にある

    #if !defined(AFX_PARAMETERSETDLG_H__98EE37B8_03E9_42EA_A93A_13A9B0375655__INCLUDED_)
    #define AFX_PARAMETERSETDLG_H__98EE37B8_03E9_42EA_A93A_13A9B0375655__INCLUDED_

    部分はヘッダーファイルの下にある

    #endif

    で一つの意味を持ちます。

    VC++ 6.0 は #pragma once ディレクティブと併用されていたと思いますが、要はコンパイル時に同じヘッダーファイルを二度読み込み、「・・・は既に定義されています」という感じのエラーを出さないようにする為のものです。

    #if !defined(AFX_PARAMETERSETDLG_H__98EE37B8_03E9_42EA_A93A_13A9B0375655__INCLUDED_)

    は次の行にある

    #define AFX_PARAMETERSETDLG_H__98EE37B8_03E9_42EA_A93A_13A9B0375655__INCLUDED_

    と組み合わされて使われ、既に

    AFX_PARAMETERSETDLG_H__98EE37B8_03E9_42EA_A93A_13A9B0375655__INCLUDED_

    が定義されていなければ #if ~ #endif 内が有効になるというものです。

    繰り返しになりますが、これら一連のものはコンパイル時に同じヘッダーが二度読み込まれないようにする為ですので、他の文字列に変えても構いませんが、他のヘッダーファイルと同じ文字列にならないものにして下さい。ただ、MFC が自動で生成したユニークな文字列なので、書き換える事はあまりお勧めしませんが。
    2009年10月15日 8:32
  • 返信をかいて 回等マークをしたらきえてしまいました


    数値が不安ですが 変えておきます。
    こぴーをとって 動作がよければ そうします

    ありがとうございました
    2009年10月15日 8:42
  • 直に 書き換えてみました やはりといった方がよいですが
    デバックで
    元々内臓している ところで
    BOOL CWnd::UpdateData(BOOL bSaveAndValidate)
    {
    ASSERT(::IsWindow(m_hWnd)); // calling UpdateData before DoModal?
    でエラーがでました
    なおRELEASEでは良かったのですが

    VSでのファイルの置き換えとかで 直ることをご存知であれば おしえてください
    もう一度Projectをつくりなおしでも 全コード書くのではなく 利用するという方法でないと
    このままにします

    ありがとうございます
    2009年10月15日 9:53
  • #if !defined 以降の文字を書き換えたという事でしょうか?

    #define 部分と同じ文字列でないとおかしな事になります。

    ::IsWindow のアサーションに引っ掛かるという事はウィンドウが作成されていないという意味です。

    確認ですが、各ヘッダーの #if !defined 以降の文字列は全て別の文字列でしょうか?

    # VC++ 6.0 では #pragma once が機能するので、気に入らなければ、#if !defined と #define、#endif を全て削除しても問題はなかったはずです。
    2009年10月15日 10:01
  • BOOL CWnd::UpdateData(BOOL bSaveAndValidate)
    {
    ASSERT(::IsWindow(m_hWnd)); // calling UpdateData before DoModal?
    でエラーがでました
    なおRELEASEでは良かったのですが
    Release では ASSERT で引っかかることはありません。
    これまで、Debug でビルド・デバッグしてこなかったのであれば、今回のインクルードガード関連のコードを変更したことが原因ではないと断言できます。
    変なタイミングで UpdateData を呼んでいないか確かめてください。


    # インクルードガードに問題があるのであれば、多くの場合はコンパイルエラーで発覚するでしょう。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年10月15日 14:10
    モデレータ
  • はい

    #if !defined(AFX_PARAMETERSETDLG_H__98EE37B8_03E9_42EA_A93A_13A9B0375655__INCLUDED_)
    #define AFX_PARAMETERSETDLG_H__98EE37B8_03E9_42EA_A93A_13A9B0375655__INCLUDED_
    最後にもあります。

    そこに PARAMETERSETDLGの文字があります。
    それを 現在つかっている PARAMETERDLG
    %0
    2009年10月19日 7:49
  • はい

    #if !defined(AFX_PARAMETERSETDLG_H__98EE37B8_03E9_42EA_A93A_13A9B0375655__INCLUDED_)
    #define AFX_PARAMETERSETDLG_H__98EE37B8_03E9_42EA_A93A_13A9B0375655__INCLUDED_

    そこに PARAMETERSETDLGの文字があります。
    それを 現在つかっている PARAMETERDLG
    に書き換えました。その結果が報告のとおりです。

    #if !defined(AFX_CHILDVIEW_H__00AB081C_A381_41AA_B5D2_605519F5E69E__INCLUDED_)
    #define AFX_CHILDVIEW_H__00AB081C_A381_41AA_B5D2_605519F5E69E__INCLUDED_

    ****************************************************************************/
    #if !defined(AFX_COLORPICKERBUTTON_H__B3199CB3_66EA_4C33_ABD3_291DDEECA87E__INCLUDED_)
    #define AFX_COLORPICKERBUTTON_H__B3199CB3_66EA_4C33_ABD3_291DDEECA87E__INCLUDED_

    #if !defined(AFX_KolamDesigner_H__23D156D8_23D7_41E1_997D_2947200F92F6__INCLUDED_)
    #define AFX_KolamDesigner_H__23D156D8_23D7_41E1_997D_2947200F92F6__INCLUDED_

    と言う風に Headerファイル名に数字文字で それぞれちがっています

    2009年10月19日 7:54
  • もう一度 そのつもり UpdateData のコードの辺りを見てみます

    2009年10月19日 7:56
  • #if defined 以降の細かい文字に大きな意味はありません。
    他のヘッダーと異なること、自身の中で同じ識別子であることを用いて、同じヘッダーファイルを複数回インクルードしないようにする、インクルードガードとしての役割を持たせているに過ぎません。

    インクルードガードについては検索して調べてください。

    # 何度も言われていると思いますが、「~して良いか」とかs尋ねるよりも、仕組みを理解するように動きましょう。


    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年10月19日 13:55
    モデレータ