我经常在头文件的开头看到这样的代码:
#ifndef HEADERFILE_H #define HEADERFILE_H
在文件的最后是
#endif
这样做的目的是什么?
它们被称为# include警卫。
一旦包含了头文件,它将检查是否定义了唯一值(在本例中是HEADERFILE_H)。如果它没有定义,则定义它并继续到页面的其余部分。
HEADERFILE_H
当再次包含代码时,第一个ifndef失败,导致一个空白文件。
ifndef
这可以防止重复声明任何标识符,如类型、枚举和静态变量。
#ifndef <token> /* code */ #else /* code to include if the token is defined */ #endif
#ifndef检查给定的令牌在文件中或包含的文件中是否已经是#defined;如果没有,则包含它和结束的#else语句之间的代码,如果没有#else语句,则包含#endif语句。#ifndef通常用于使头文件具有幂等性,方法是在文件包含后定义一个令牌,并检查该令牌是否在该文件的顶部设置。
#ifndef
#defined
#else
#ifndef _INCL_GUARD #define _INCL_GUARD #endif
这样可以防止同一头文件被多次包含。
#ifndef __COMMON_H__ #define __COMMON_H__ //header file content #endif
下次定义__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