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

6uxekuva  于 2023-11-16  发布在  其他
关注(0)|答案(5)|浏览(144)

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

#ifndef HEADERFILE_H
#define HEADERFILE_H

字符串
文件的最后是

#endif


这样做的目的是什么?

wn9m85ua

wn9m85ua1#

这就是所谓的#include guards
一旦包含了header,它会检查是否定义了一个唯一的值(在本例中是HEADERFILE_H),如果没有定义,它会定义它并继续到页面的其余部分。
当再次包含该代码时,第一个ifndef失败,导致一个空白文件。
这可以防止任何标识符(如类型、枚举和静态变量)的双重声明。

2wnc66cl

2wnc66cl2#

#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

juud5qan

juud5qan3#

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

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

字符串
假设你已经在多个文件中包含了这个头文件。所以第一次没有定义__COMMON_H__,它将被定义并包含头文件。
下次定义__COMMON_H__时,它将不再包含。

wz3gfoph

wz3gfoph4#

他们被称为ifdef或包括警卫。
如果编写一个小程序,它可能看起来不需要,但随着项目的增长,你可能会有意或无意地多次包含一个文件,这可能会导致编译警告,如变量已经声明。

  • #ifndef检查HEADERFILE_H是否未声明。
  • #ifndef生成true后,#define将声明HEADERFILE_H
  • #endif是要知道#ifndef的作用域,即#ifndef的结束。

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

dly7yett

dly7yett5#

ifndef检查给定的token是否已经在文件或包含的文件中被#定义;如果没有,它包括它和关闭的#else之间的代码,或者如果没有#else存在,#endif语句。#ifndef通常用于使头文件等幂,方法是在文件被包含后定义一个token,并检查该token没有设置在该文件的顶部。

#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

字符串

相关问题