为什么在c++头文件中使用#ifndef和#define ?

我经常在头文件的开头看到这样的代码:

#ifndef HEADERFILE_H
#define HEADERFILE_H

在文件的最后是

#endif

这样做的目的是什么?

608411 次浏览

它们被称为# include警卫

一旦包含了头文件,它将检查是否定义了唯一值(在本例中是HEADERFILE_H)。如果它没有定义,则定义它并继续到页面的其余部分。

当再次包含代码时,第一个ifndef失败,导致一个空白文件。

这可以防止重复声明任何标识符,如类型、枚举和静态变量。

#ifndef <token>
/* code */
#else
/* code to include if the token is defined */
#endif

#ifndef检查给定的令牌在文件中或包含的文件中是否已经是#defined;如果没有,则包含它和结束的#else语句之间的代码,如果没有#else语句,则包含#endif语句。#ifndef通常用于使头文件具有幂等性,方法是在文件包含后定义一个令牌,并检查该令牌是否在该文件的顶部设置。

#ifndef _INCL_GUARD
#define _INCL_GUARD
#endif

这样可以防止同一头文件被多次包含。

#ifndef __COMMON_H__
#define __COMMON_H__
//header file content
#endif
假设你已经在多个文件中包含了这个头文件。第一次 __COMMON_H__未定义,它将被定义并包含头文件

下次定义__COMMON_H__时,它将不再包含。

它们被称为ifdef或包含警卫。

如果写一个小程序,它可能看起来是不需要的,但随着项目的发展,你可能有意或无意地多次包含一个文件,这可能会导致编译警告,如变量已声明。

#ifndef checks whether HEADERFILE_H is not declared.
#define will declare HEADERFILE_H once #ifndef generates true.
#endif is to know the scope of #ifndef i.e end of #ifndef

如果没有声明,这意味着#ifndef生成true,那么只有在#ifndef和#endif之间的部分执行,否则不执行。这将防止再次声明标识符、枚举、结构等…

#ifndef检查给定的令牌是否已经在文件中或包含的文件中#定义过;如果没有,则包含它和结尾的#else语句之间的代码,如果没有#else语句,则包含#endif语句。#ifndef通常用于使头文件具有幂等性,方法是在文件包含后定义一个令牌,并检查该令牌是否在该文件的顶部设置。

#ifndef ABOUTSCREEN_H
#define ABOUTSCREEN_H


#include <fcntl.h>
#include <unistd.h>


#define CHARGING_STATUS_FILE "/cable.2/state"


#define LED_ON "255"
#define LED_OFF "0"


namespace Ui
{
class aboutScreen;
}


class aboutScreen : public QWidget
{
Q_OBJECT


public:
enum LedColors
{
OFF,
RED,
BLUE,
GREEN,
WHITE
};


explicit aboutScreen(QWidget *parent = 0, Ui::mainStackWidget *uiMainStackWidget = 0);
~aboutScreen();
void init(void);
void writeLedStatus(QString, QString);


public slots:
void updateBatteryAndStorageStatus(void);


private slots:
void on_backButton_pressed();
void on_backButton_released();


private:
Ui::mainStackWidget *uiMainStackWidget;
};


#endif // ABOUTSCREEN_H