我经常在头文件的开头看到这样的代码:
#ifndef HEADERFILE_H #define HEADERFILE_H
字符串文件的最后是
#endif
型这样做的目的是什么?
wn9m85ua1#
这就是所谓的#include guards。一旦包含了header,它会检查是否定义了一个唯一的值(在本例中是HEADERFILE_H),如果没有定义,它会定义它并继续到页面的其余部分。当再次包含该代码时,第一个ifndef失败,导致一个空白文件。这可以防止任何标识符(如类型、枚举和静态变量)的双重声明。
HEADERFILE_H
ifndef
2wnc66cl2#
#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
型
juud5qan3#
这可以防止多次包含同一个头文件。
#ifndef __COMMON_H__ #define __COMMON_H__ //header file content #endif
字符串假设你已经在多个文件中包含了这个头文件。所以第一次没有定义__COMMON_H__,它将被定义并包含头文件。下次定义__COMMON_H__时,它将不再包含。
wz3gfoph4#
他们被称为ifdef或包括警卫。如果编写一个小程序,它可能看起来不需要,但随着项目的增长,你可能会有意或无意地多次包含一个文件,这可能会导致编译警告,如变量已经声明。
#define
如果没有声明,这意味着#ifndef生成true,那么只执行#ifndef和#endif之间的部分,否则不执行。这将防止再次声明标识符,枚举,结构等。
dly7yett5#
#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
字符串
5条答案
按热度按时间wn9m85ua1#
这就是所谓的#include guards。
一旦包含了header,它会检查是否定义了一个唯一的值(在本例中是
HEADERFILE_H
),如果没有定义,它会定义它并继续到页面的其余部分。当再次包含该代码时,第一个
ifndef
失败,导致一个空白文件。这可以防止任何标识符(如类型、枚举和静态变量)的双重声明。
2wnc66cl2#
字符串
#ifndef
检查给定的令牌是否在文件或包含的文件中更早地被#defined
;如果不存在,则它包括它与结束#else
之间的代码,或者,如果不存在#else
,#endif
语句.#ifndef
通常用于使头文件具有幂等性,方法是在文件被包含后定义一个标记,并检查该标记是否而不是设置在文件的顶部。型
juud5qan3#
这可以防止多次包含同一个头文件。
字符串
假设你已经在多个文件中包含了这个头文件。所以第一次没有定义__COMMON_H__,它将被定义并包含头文件。
下次定义__COMMON_H__时,它将不再包含。
wz3gfoph4#
他们被称为ifdef或包括警卫。
如果编写一个小程序,它可能看起来不需要,但随着项目的增长,你可能会有意或无意地多次包含一个文件,这可能会导致编译警告,如变量已经声明。
#ifndef
检查HEADERFILE_H
是否未声明。#ifndef
生成true后,#define
将声明HEADERFILE_H
。#endif
是要知道#ifndef
的作用域,即#ifndef
的结束。如果没有声明,这意味着
#ifndef
生成true,那么只执行#ifndef
和#endif
之间的部分,否则不执行。这将防止再次声明标识符,枚举,结构等。dly7yett5#
ifndef检查给定的token是否已经在文件或包含的文件中被#定义;如果没有,它包括它和关闭的#else之间的代码,或者如果没有#else存在,#endif语句。#ifndef通常用于使头文件等幂,方法是在文件被包含后定义一个token,并检查该token没有设置在该文件的顶部。
字符串