0

不要な詳細が含まれないように問題を抽象化しますが、必要に応じてソースコードを提供できます。VisualStudioを使用しています。

私は次のファイルを持っています-すべてのヘッダーファイルには一度#pragmaがあります:

  • A.cpp //(私のメイン関数を含む)
  • Bh
  • B.cpp //(役割を果たしません)
  • Ch
  • C.cpp

そして、これがプリプロセッサコマンドの設定方法です。

A.cpp   #defines UseOptionOne
A.cpp   #includes B.h

B.h     #ifdef UseOptionOne   
            #defines Func as f1() //(calling a function that prints a msg)   
        #else                 
            #defines Func as [blank]  

A.cpp   #includes C.h
C.h     #includes B.h     // (B.h have #pragma once, so it doesnt get included again)

関数呼び出しの設定方法は次のとおりです。

A.cpp   main function uses Func          //- It prints as intended 
A.cpp   calls function in C.cpp // this function does the following:
        {
           #ifndef UseOptionOne
             exit(0)                    //- Doesn't happen, so UseOptionOne is defined
           #endif   
           uses Func                        //- DOES NOTHING?????
        }
A.cpp   uses Func                       //- It prints as intended 

これがどのように可能かわかりませんか?UseOptionOneはChでまだ定義されていることが確認されていますが、Funcは別の方法で定義されていますか?

誰かがこれを説明できますか?それとも、私のかなり複雑なソリューションやいくつかのコードフラグメントを提供してほしいですか?

私は本当に迷っています:(

編集:C.cpp関数が呼び出されたことを確認するためにブレークポイントを使用しましたが、「Func」は単に空白として扱われます

EDIT2:評判が悪いため、自分の質問に答えることができないので、ここに入れます:抽象的な説明を実装する新しいプロジェクトを作成しました が
、#ifndefで終了がトリガーされました。
この説明で問題を解決します。もう一度すべてを調べて、間違い/エラーを見つける必要があります。

4

1 に答える 1

2

私の2セント:

UseOptionsOneは、A.cppおよびAhを含むクラスに対してのみ定義されます。この場合、A.cppでのみ定義されます。

C.cppにはAhへの参照がないため、defineは表示されません。この場合、UseOptionOneはC.cppで宣言されておらず、空白の関数を使用します。

C.cppのスコープから出て、A.cppのスコープに戻ると、そのスコープでUseOptionOneが定義されているため、関数は機能します。

すべてのファイルでdefineを使用する場合は、個別のdefinitions.hヘッダーを作成して定義を挿入し、そのファイルを定義を機能させるすべてのヘッダーに含めることができます。

于 2012-08-03T16:29:29.780 に答える