C++中的标题保护程序

Sim*_*ity 30 c c++ macros include-guards header-files

LearnCpp.com上| 1.10 - 首先看一下预处理器.在Header guards下,有一些代码片段:

add.h:

#include "mymath.h"
int add(int x, int y);
Run Code Online (Sandbox Code Playgroud)

subtract.h:

#include "mymath.h"
int subtract(int x, int y);
Run Code Online (Sandbox Code Playgroud)

main.cpp中:

#include "add.h"
#include "subtract.h"
Run Code Online (Sandbox Code Playgroud)

在实施头部防护时,提到如下:

#ifndef ADD_H
#define ADD_H

// your declarations here

#endif
Run Code Online (Sandbox Code Playgroud)
  • 宣言可以在这里发生什么?而且,应该int main()#endif吗?
  • 是添加_H约定还是必须做的事情?

谢谢.

The*_*uck 55

FILENAME_H是一个惯例.如果你真的想要,你可以使用它#ifndef FLUFFY_KITTENS作为一个标题保护(假设它没有在其他任何地方定义),但如果你在其他地方定义它,那将是一个棘手的错误,比如说是某些东西或其他的小猫数量.

在头文件add.h中,声明字面意思是在#ifndef和之间#endif.

#ifndef ADD_H
#define ADD_H

#include "mymath.h"
int add(int x, int y);

#endif
Run Code Online (Sandbox Code Playgroud)

最后,int main()不应该在头文件中.它应该始终在一个.cpp文件中.

清除它:

#ifndef ADD_H基本上意味着"如果ADD_H没有#defined在文件中或在包含的文件中,那么在#ifndef#endif指令之间编译代码".所以,如果你尝试#include "add.h"比一次多.cpp文件,编译器会看到ADD_H是什么已经#defined和将忽略之间的代码#ifndef#endif.标头保护仅阻止头文件在同一.cpp文件中多次包含.标头保护不会阻止其他.cpp文件包含头文件.但是所有.cpp文件只能包含一次受保护的头文件.


Fre*_*urk 17

  • 预处理一个实现(".cpp")文件的结果是翻译单元(TU).

  • 标头可以包括其他标头,因此标头可以在同一TU内间接包含多次.(你的mymath.h就是一个例子.)

  • 定义每TU最多只能发生一次.(某些定义也必须不在多个TU中;这种情况略有不同,此处不再讨论.)

  • 问题包括警卫解决是在一个TU内多次包含给定标头时防止多个定义错误.

  • 通过"包装"标题的内容来包括警卫工作,使得第二个和后续包含是no-ops.#ifndef/#define指令应该是文件的前两行,而#endif应该是最后一行.

  • 包含防护仅用于标题.不要在标题中定义主函数:将其放在实现文件中.

如果你有一个标题来定义一个类型并声明一个函数,但是它本身还需要一个标题:

#include "other_header.h"

struct Example {};

void f();
Run Code Online (Sandbox Code Playgroud)

用包含警卫"包装"它可以提供文件的完整内容:

#ifndef UNIQUE_NAME_HERE
#define UNIQUE_NAME_HERE

#include "other_header.h"

struct Example {};

void f();

#endif
Run Code Online (Sandbox Code Playgroud)

用于包含保护的名称必须是唯一的,否则冲突的名称将产生令人困惑的结果.这些名称只是简单的宏,并且语言中没有任何内容强制执行某种样式.但是,项目约定通常会强制要求.在SO和其他地方你可以找到几种不同的防护命名样式; 这个答案提供了良好的标准和良好的概述.


Pup*_*ppy 1

不,int main() 位于 .cpp 中。声明是您要放入标头中的其他内容。_H是一个约定,您可以看到各种标头保护约定。