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

#ifndef HEADERFILE_H
#define HEADERFILE_H

在文件的最后是

#endif

这样做的目的是什么?


当前回答

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

#ifndef __COMMON_H__
#define __COMMON_H__
//header file content
#endif

假设您已经将这个头文件包含在多个文件中。第一次 __COMMON_H__未定义,它将被定义并包含头文件。

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

其他回答

这些被称为#include守卫。

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

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

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

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

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

#ifndef _INCL_GUARD
#define _INCL_GUARD
#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

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

#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之间的部分执行,否则不执行。这将防止再次声明标识符、枚举、结构等…