c++ - 检查#include 是否已经声明

标签 c++ include

我正在尝试检查是否有一个 #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/

相关文章:

c++ - Qt 如何从运行的线程更新主窗口,正确的方法

c++ - 将#include <> 替换为#include ""

c - 让 function1 调用 function2 并让 function2 调用 function1 的干净方法是什么?

Grails-标准Grails标记内的自定义标记

java - 在 Java 应用程序中嵌入 Web 浏览器

javascript - 使用 lodash 从字符串数组中查找子字符串

c++ - 关于检查数据是否存在的 C++ 程序崩溃

c++ - 如何访问子实例

c++ - 函数的指针参数

C++ 从基类引用子类指针属性