检查是否已声明#include

Bit*_*map 10 c++ include

我试图检查是否#include <file.h>已经使用C++宏声明了.

在file.h我做:

#ifndef FILE.H
#define FILE.H
class A
{
  //do routines 
};
#endif
Run Code Online (Sandbox Code Playgroud)

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

典型的伪代码:

#ifndef "file.h"
#include "file.h"
#endif

#ifndef SECOND.H
#define SECOND.H
class second
{
  //do routine
};
#endif
Run Code Online (Sandbox Code Playgroud)

我尝试了一些#ifndef指令,但没有快乐.有谁知道如何实现这一目标?

Mar*_*ork 10

其他人都已正确包含了包含保护宏.

File.h

#ifndef   FILE_H
#define   FILE_H
// Code here
#endif
Run Code Online (Sandbox Code Playgroud)

但其他人错过了关于正确用法的问题的第二部分:

这是一个不良用法的例子:

#ifndef  FILE_H  
#include "file.h"
#endif

#ifndef SECOND_H
#define SECOND_H
class second
{
  //do routine
};
#endif
Run Code Online (Sandbox Code Playgroud)

这是不正确的(虽然正确可能太强).

每个文件中的包含警戒应包围其整个内容.所以,在第二个文件中,#include "file.h"应该在包含警戒内.

你也不要需要测试包括将文件本身内进行.因此该文件应如下所示:

#ifndef SECOND_H
#define SECOND_H

#include "file.h"

class second
{
  //do routine
};
#endif
Run Code Online (Sandbox Code Playgroud)

你的宏观守卫太小了.其他人很可能会使用这些; 这将导致各种奇怪的碰撞.

使警卫独特的一个好方法是使用前缀,您的全名(或昵称),或者如果您拥有自己的注册网站,则使用其域名.然后我还添加了包含该文件的目录层次结构的一部分.

#ifndef    WEBSITE1_NAMESPACE1_NAMESPACE2_FILENAME_H
#define    WEBSITE1_NAMESPACE1_NAMESPACE2_FILENAME_H

#endif
Run Code Online (Sandbox Code Playgroud)

另一种替代方法(特别是如果您在Windows上工作)是生成GUID.只需为每个文件生成一个新文件.

最后一点:如果内容是绝对必要的,则只包含头文件中的其他文件.如果此文件具有类second定义的类型定义,则只需要包含"file.h".如果您的类仅将该类用作指针或引用,则更喜欢使用前向声明而不是头文件.

您必须的场景#include:

  • 第二个是第一个孩子.
  • 第二个成员是第一个成员 objects
  • 第二个具有首先objects作为参数的方法
  • 第二具有第一返回方法(或多个)objects作为结果

请注意,我使用术语"对象".如果它们是引用或指针,那么这不算数.在这些情况下,您可以使用前向声明来解决问题.


nob*_*ody 7

在file.h中:

#ifndef FILE_H
#define FILE_H
...
...
...
#endif
Run Code Online (Sandbox Code Playgroud)

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

#ifdef FILE_H
Run Code Online (Sandbox Code Playgroud)