gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 15:39:18 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com