3

define プリプロセッサ ディレクティブの形式は次のとおりです。

#ifndef  SIZE
#define SIZE 10
int hello[SIZE];
#endif

しかし、次のコードを見ると、プリプロセッサ ディレクティブに代わるものはありません。

#ifndef CREDIT_CARD_H                    // Avoid repeated expansion
#define CREDIT_CARD_H

#include <string>                        // Provides string
#include <iostream>                      // Provides ostream

class CreditCard
{
    public:
        CreditCard(const std::string& no,    // Constructor
                   const std::string& nm, int lim, double bal = 0);

        // Accessor functions
        std::string    getNumber()const    { return number; }
        std::string    getName() const     { return name; }
        double         getBalance() const  { return balance; }
        int            getLimit() const    { return limit; }

        bool chargeIt(double price);       // Make a charge
        void makePayment(double payment);  // Make a payment

    private:                               // Private member data
        std::string    number;             // Credit card number
        std::string name;                  // Card owner's name
        int            limit;              // Credit limit
        double        balance;             // Credit card balance
};

std::ostream& operator<<(std::ostream& out, const CreditCard& c);
#endif

これは何を意味するのでしょうか?

4

4 に答える 4

5

と言うことができます。つまり#define FOO、それは#ifdef FOOtrue になりますFOOが、置換テキストはありません。これは、インクルード ガードのような条件付きチェックに正確に役立ちます。

また、一般的なケースでは空にしたいプラットフォーム固有の拡張機能にも役立ちます。

#ifdef WIN32
#  define API __declspec(dllexport)
#else
#  define API
#endif

API void foo();
于 2012-08-20T08:03:07.117 に答える
3

そのタイプのディレクティブは、条件に応じてファイルに貼り付けられます。

#ifndef  SIZE

//whatever

#endif

と の間にあるものは、#ifndef定義されていない場合にのみ#endifコンパイラによって認識されます。 SIZE

2 番目のコードでも同じことが起こります。

#ifndef CREDIT_CARD_H                   // avoid repeated expansion
#define CREDIT_CARD_H

//....

#endif

クラス定義とインクルードは、CREDIT_CARD_H事前に定義されていない場合にのみ表示されます。これは、インクルード ガードとして知られています。

マクロを何かとして定義する必要はありません#ifdef SIZE。サイズを実際に「設定」せずに定義するだけでよいのです。

于 2012-08-20T08:04:06.203 に答える
1

ファイルが 1 回だけインクルードされるようにするためのインクルード ガードです。

#include "CreditCard.h"
#include "CreditCard.h"

2 回目に含まれる CREDIT_CARD_H は既に定義されているため、定義全体をスキップします。

このようにファイルを 2 回直接インクルードすることになりますが、1 つのインクルード ファイルが別のインクルード ファイルをインクルードすることはよくあることであり、これにより重複定義が発生しなくなります。

実際の値は使用されず、現在定義されているという事実のみが使用されます

于 2012-08-20T09:31:20.143 に答える
0

あなたが探しているのは#pragma once

https://en.wikipedia.org/wiki/Pragma_once

于 2021-05-18T14:44:06.393 に答える