我正在研究在 C++ 中包含守卫,并从Wikipedia遇到了这个命名约定:
CREATORSNAME_YYYYMMDD_HHMMSS
我现在知道这是一个时间戳,然后说
#ifndef CREATORSNAME_YYYYMMDD_HHMMSS
#define CREATORSNAME_YYYYMMDD_HHMMSS
#endif
那么编译器如何知道它是 HeaderName.h 呢?
这只是一种方便的方式来存储有关编写模块的人以及何时编写的文档,这保证了警卫的唯一性(通过日期),并为引用该模块的其他人提供了额外的信息。特别是如果他们认为相应的实现存在问题,那么他们就会有人写信给他们。否则,模块的创建者可能会忘记添加关于他们是谁的文档。
#ifndef CHRIS_20140807_011555
#define CHRIS_20140807_011555
struct foo {
int member;
};
#endif /* CHRIS_20140807_011555 */
或者,您可以这样做,但它不提供额外的信息,并且在顶部添加文档很容易忘记。(虽然老实说,它应该成为习惯,并且不应该被遗忘)。但是,这仍然可能是这种做法的动机,尽管下面的选项被更广泛地使用。
/*
* AUTHOR: Chris
* DATE: July 7, 2013
*
* These comments are easy to forget
*/
#ifndef FILENAME_H
#define FILENAME_H
struct foo {
int member;
};
#endif /* FILENAME_H */
这个:
#ifndef AAAA
#define AAAA
struct foo {
int member;
};
#endif
和
#pragma once
struct foo {
int member;
};
所有这些代码片段都完成了完全相同的事情。
对于 John Doe 于 2013 年 1 月 1 日下午 12:00 制作的名为 MyFile.h 的文件,您将使用:
#ifndef JOHNDOE_20130101_120000
#define JOHNDOE_20130101_120000
// File contents
#endif
为什么您不想将文件名放在包含保护中,这超出了我的理解。