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和其他地方你可以找到几种不同的防护命名样式; 这个答案提供了良好的标准和良好的概述.
归档时间: |
|
查看次数: |
66352 次 |
最近记录: |