我正在尝试检查是否有一个 #include <file.h>
已经使用 C++ 宏声明。
例子
在 file.h 中我这样做:
#ifndef FILE.H
#define FILE.H
class A
{
//do routines
};
#endif
在名为 second.h
的第二个文件中我想检查是否 file.h
已经包含在内。
典型伪代码:
#ifndef "file.h"
#include "file.h"
#endif
#ifndef SECOND.H
#define SECOND.H
class second
{
//do routine
};
#endif
我试过几个#ifndef
指示但没有喜悦。有谁知道如何实现这一点?
最佳答案
其他人都介绍了如何正确包含 include guard 宏。
文件.h
#ifndef FILE_H
#define FILE_H
// Code here
#endif
但其他人都错过了你关于正确用法的问题的第二部分:
这是一个错误用法的例子:
#ifndef FILE_H
#include "file.h"
#endif
#ifndef SECOND_H
#define SECOND_H
class second
{
//do routine
};
#endif
这是不正确的(虽然正确可能太强了)。
每个文件中的 include guards 应该包围它们的全部内容。因此,在第二个文件中,#include "file.h"
应该在 include guards 中。
此外,您不需要测试将在文件本身内部完成的包含。因此该文件应如下所示:
#ifndef SECOND_H
#define SECOND_H
#include "file.h"
class second
{
//do routine
};
#endif
而且你的宏守卫太小了。这些很有可能会被其他人使用;这将导致各种奇怪的碰撞。
使守卫独一无二的一个好方法是使用前缀、您的全名(或昵称),或者如果您有自己的注册网站,则使用其域名。然后,我还添加了包含该文件的目录层次结构的一部分。
#ifndef WEBSITE1_NAMESPACE1_NAMESPACE2_FILENAME_H
#define WEBSITE1_NAMESPACE1_NAMESPACE2_FILENAME_H
#endif
另一种选择(特别是如果您在 Windows 上工作)是生成一个 GUID。只需为每个文件生成一个新文件即可。
最后一点:只有在绝对必要的情况下才包含头文件中的其他文件。如果此文件具有类 second 所依赖的类型定义,则只需包含“file.h”。如果您的类仅将该类用作指针或引用,则更愿意使用前向声明而不是包含头文件。
你必须#include
的场景是:
- second 是 first 的 child 。
- second 的成员是 first
objects
- second 具有将 first
objects
作为参数的方法 - 第二个具有返回第一个
对象
作为结果的方法
请注意,我使用了术语“对象”。如果它们是引用或指针,则这不算数。在这些情况下,您可以使用前向声明来解决问题。
关于c++ - 检查#include 是否已经声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6973749/