检查是否已经声明了#include

Checking whether #include is already declared

本文关键字:#include 声明 是否 检查      更新时间:2023-10-16

我正在尝试检查#include <file.h>是否已经使用c++宏声明。

例子

In file.h I do:

#ifndef FILE.H
#define FILE.H
class A
{
  //do routines 
};
#endif

在第二个名为second.h的文件中,我想检查file.h是否已经包含。

典型psuedo-code:

#ifndef "file.h"
#include "file.h"
#endif
#ifndef SECOND.H
#define SECOND.H
class second
{
  //do routine
};
#endif

我已经尝试了一些#ifndef指令,但没有快乐。有人知道如何做到这一点吗?

其他人都已经介绍了include保护宏的正确包含。

File.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守卫应该包围它们的整个内容。因此,在第二个文件中,#include "file.h"应该在include保护符内。

同样,不需要测试是否包含将在文件本身内部完成。因此,文件应该像这样:

#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。只需为每个文件生成一个新文件。

最后一点:只包含头文件中绝对必要的其他文件。您只需要包含"file.h"如果此文件具有类第二所依赖的类型定义。如果你的类只使用那个类作为指针或引用,那么最好使用前向声明,而不是包括头文件。

必须设置#include的场景有:

  • second是first的子节点。
  • second有第一个成员objects
  • second具有以第一个objects作为参数的方法
  • Second的方法返回第一个objects作为结果

注意我用了"对象"这个词。如果它们是引用或指针,则不计算。在这些情况下,您可以使用前向声明来解决问题。

in file.h:

#ifndef FILE_H
#define FILE_H
...
...
...
#endif

然后检查file.h是否包含在:

#ifdef FILE_H

原因很简单#ifndef FILE_H头文件中的第一行是为了使其在第二次和进一步包含时,该文件是无操作的。这些#行加在一起被称为"include保护符"。

因此,只需执行#include "file.h"将已经执行您在第二个文件中尝试执行的操作。(预处理器可能会在丢弃文件内容之前打开并读取文件,但假设它在缓存中是合理的,因此在一般情况下没有预期的编译器性能提高。

如果你抱怨一个文件没有包含在内,你可以自己包含它。也许您想要禁止在包含另一个文件时包含一个文件,因此它们是非此即彼的;或者包含的严格排序(可能是设计问题的症状)。或者当某些内容已经(未)包含时使用替代代码。

在这种情况下,#ifdef X#ifndef X,其中X匹配在包含保护中使用的,将工作

In file.h

#ifndef FILE_H_
#define FILE_H_
#else
#error file.h has been included previously
#endif

但是,如果您多次包含file.h,将导致程序无法编译。你可能想要的是

#ifndef FILE_H_
#define FILE_H_
// contents of file.h go here
#endif

这将防止由于多次包含而导致的编译错误/警告。

这样做的典型方法是:

#ifndef _FILE_H_
#define _FILE_H_
// some code
#endif

所有答案都涵盖了。对于包含多个包含的大型项目,这里有一个提示,在包含之前使用#define FILE_H非常重要。否则你会递归地得到错误。如

MAIN
#ifndef FILE1_H
  #include "file1.h"
  #define FILE1_H
#endif
FILE1
#ifndef FILE2_H
  #include "file2.h"
  #define FILE2_H
#endif
FILE2
#ifndef FILE1_H
 #include "file1.h" **<-- FILE2_H and FILE1_H aren't yet defined so it'll be resursively included**
 #define FILE1_H
#endif