我有3个头文件:
misc.h
MyForm.h
Registration.h
在misc.h文件中我放了
#ifndef MISC_H
#define MISC_H
#endif
在MyForm.h中,我把
#include "misc.h"
#include "Registration.h"
在Registration.h中,我把
#include "misc.h"
感谢您的帮助。
答案 0 :(得分:7)
如何命名包括警卫在某种程度上基于意见,但可以提出一些建议:
1)不要让它们变短,因为它们可能会与其他文件或您使用的实现或库中定义的其他宏冲突。
2)使它们包含项目特定的前缀,以使它们具有唯一性和明确性。
3)如果您的项目包含多个子部分“模块”/“库”等,请使防护名称包含模块的名称,以使其在项目中唯一 - 包括文件名。
4)确保不使用NULL
之类的保留名称,以数字开头的名称或以下划线后跟大写字母开头的名称以及包含连续下划线的名称;所有这些名称都保留给实现使用。
5)对宏使用全部大写(只是一个常见的约定)。
对于名为“foo”的项目中名为“baz.h”的文件,在子模块“bar”中,我将保护名称FOO_BAR_BAZ_H
。
PS。确保所有你的标题使用包含警戒(非常特殊和罕见情况除外)。否则,您会遇到多个定义错误等问题。
答案 1 :(得分:4)
如何在c ++中正确命名包含警卫
通常惯例是仅使用大写字符。除了第一个字符外,数字和下划线也很好。包含保护必须是唯一的:名称不得用于程序中的任何其他内容。
不得保留名称,因此您不得使用NULL
。此外,所有以下划线开头后跟大写字母的名称以及包含两个连续下划线的所有名称都将被保留。
MISC_H
不是保留的,但请记住,如果您在另一条路径中有另一个misc.h
,那么您就不能使用相同的包含守卫。通常最好使用较长的名称来唯一标识文件。也许使用某种前缀,例如公司名称或您自己的名字。通常_H
后缀用于与非保护宏分开。
如果您在提出未保留的唯一名称时遇到问题,或者只是觉得它很乏味,那么您可以使用#pragma once
代替。请注意,这不是标准。我听说过有关不支持它的外来编译器的谣言,以及复杂的构建过程,其中硬链接文件没有得到应有的保护。如果你遇到这样的问题,那么之后简单地添加标题保护是微不足道的。
您的其他标题似乎缺少包含警卫。如果将它们包含在任何标题中,则可能会出现问题。保护所有头文件是一种很好的做法。
我需要将#endif放在misc.h的底部吗?
是。守卫只保护define和endif之间的代码。
答案 2 :(得分:3)
您应该在每个头文件中使用include guards,并且不应该在包含警戒之外。
包含警卫的名称可以是任何东西,只要它不可能与任何其他名称冲突。 MyForm.h的一个示例可能是:
#ifndef MYFORM_HEADER_
#define MYFORM_HEADER_
#include "misc.h"
#include "Registration.h"
/* all code here */
#endif
在头文件中没有任何内容写入包含警戒也很重要。
答案 3 :(得分:1)
您需要将个人include guards放入每个标头中,尤其是MyForm.h
:
#ifndef MYFORM_H
#define MYFORM_H
#include "misc.h"
#include "Registration.h"
// etc...
#endif /*MYFORM_H*/
和Registration.h
:
#ifndef REGISTRATION_H
#define REGISTRATION_H
// actual code
// etc...
#endif /*REGISTRATION_H*/