为什么没有替换预处理程序指令?

时间:2012-08-20 08:01:10

标签: c++ c-preprocessor

定义预处理程序指令的格式为:

#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 个答案:

答案 0 :(得分:5)

您可以说#define FOO,这意味着#ifdef FOO将成立,但FOO没有任何替换文字。这对于像包含警卫这样的条件检查非常有用。

它对于特定于平台的扩展也很有用,在一般情况下,您希望它们为空:

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

API void foo();

答案 1 :(得分:3)

该类型的指令根据条件粘贴在文件中:

#ifndef  SIZE

//whatever

#endif

只有在未定义 #ifndef时,编译器才会看到#endifSIZE之间的任何内容。

第二段代码也是如此:

#ifndef CREDIT_CARD_H                   // avoid repeated expansion
#define CREDIT_CARD_H

//....

#endif

仅在事先未定义CREDIT_CARD_H时才会看到类定义和包含。这被称为包括警卫。

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

答案 2 :(得分:1)

包含警卫,以确保该文件仅包含一次。

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

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

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

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

答案 3 :(得分:0)

我认为您正在寻找的是 #pragma once

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