定义预处理程序指令的格式为:
#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
这是什么意思?
答案 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
时,编译器才会看到#endif
和SIZE
之间的任何内容。
第二段代码也是如此:
#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