我经常在头文件的开头看到这样的代码:
#ifndef HEADERFILE_H
#define HEADERFILE_H
在文件的最后是
#endif
这样做的目的是什么?
我经常在头文件的开头看到这样的代码:
#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之间的部分执行,否则不执行。这将防止再次声明标识符、枚举、结构等…