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

问题描述 投票:0回答:5

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

#ifndef HEADERFILE_H
#define HEADERFILE_H

文件末尾是

#endif

这样做的目的是什么?

c++ c c-preprocessor
5个回答
718
投票

那些被称为#包括守卫

包含标头后,它会检查是否定义了唯一值(在本例中为

HEADERFILE_H
)。然后,如果未定义,则会定义它并继续到页面的其余部分。

再次包含代码时,第一个

ifndef
失败,导致文件空白。

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


59
投票
#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

20
投票

这可以防止多次包含相同的头文件。

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

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

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


7
投票

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

如果编写一个小程序,似乎不需要它,但随着项目的增长,您可能会有意或无意地多次包含一个文件,这可能会导致编译警告,例如变量已声明。

  • #ifndef
    检查
    HEADERFILE_H
    是否未声明。

  • 一旦
  • #define

    生成 true,

    HEADERFILE_H
    将声明
    #ifndef

  • #endif
    就是知道
    #ifndef
    的范围,即
    #ifndef
    的结尾。

如果没有声明,则

#ifndef
生成true,则仅执行
#ifndef
#endif
之间的部分,否则不执行。这将防止再次声明标识符、枚举、结构等...


2
投票

#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
© www.soinside.com 2019 - 2024. All rights reserved.