3

定义预处理器指令的格式是:

#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 FOO将是真实的,但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

第二段代码也是如此:

#ifndef CREDIT_CARD_H                   // avoid repeated expansion
#define CREDIT_CARD_H

//....

#endif

CREDIT_CARD_H只有事先没有定义类定义和包含才会被看到。这称为包含防护。

您不必将宏定义为某种东西,您可以说#ifdef SIZE没有实际“设置”任何东西的大小,只需定义它。

于 2012-08-20T08:04:06.203 回答
1

这是一个包含保护,以确保文件只被包含一次。

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

第二次包含 CREDIT_CARD_H 已经定义,因此它会跳过整个定义。

现在你会像这样直接包含一个文件两次,但是一个包含文件包含另一个文件是很常见的,这会阻止任何重复定义的发生。

实际值从未使用过,只是现在已定义的事实

于 2012-08-20T09:31:20.143 回答
0

我想你正在寻找的是#pragma once

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

于 2021-05-18T14:44:06.393 回答