c++ 正在检查是否已声明#include

byqmnocz  于 2023-01-28  发布在  其他
关注(0)|答案(6)|浏览(190)

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

示例

在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指令,但没有喜悦。有人知道如何实现这一点吗?

ibps3vxo

ibps3vxo1#

其他人已经介绍了正确包含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保护都应该包围它们的整个内容,因此,在第二个文件中,#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,只需为每个文件生成一个新的GUID。
最后一点:如果绝对需要头文件中的其他文件,则只包含这些文件。如果该文件具有类second依赖的类型定义,则只需要包含“file.h”。如果类只将该类用作指针或引用,则最好使用前向声明,而不是包含头文件。
必须使用#include的情况包括:

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

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

2guxujil

2guxujil2#

在文件.h中:

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

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

#ifdef FILE_H
fcy6dtqo

fcy6dtqo3#

在文件头中使用#ifndef FILE_H行的原因很简单,就是为了使文件在第二次或更多次包含时是空操作的,这些#行放在一起称为“include guard”。
因此,简单地执行#include "file.h"就已经完成了您在第二个文件中尝试执行的操作。(预处理器可能会在丢弃文件内容之前打开并读取该文件,但可以合理地假设它在缓存中,因此在一般情况下编译器性能不会提高。
如果你抱怨一个文件没有被包含,你可以自己包含它。也许你想禁止一个文件被包含,当另一个文件被包含,所以他们是非此即彼;或者严格的包含顺序(可能是设计问题的症状)。或者当一些东西已经(没有)被包含时使用替代代码。
在这种情况下,#ifdef X#ifndef X将起作用,其中X与包含保护中使用的内容匹配。

mklgxw1f

mklgxw1f4#

在文件. 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

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

iovurdzv

iovurdzv5#

执行此类操作的典型方法是:

#ifndef _FILE_H_
#define _FILE_H_

// some code

#endif

这将防止同一个标头被多次包含。

tsm1rwdh

tsm1rwdh6#

所有的答案都包括在内。对于有多个include的大型项目,这只是一个提示,在include之前使用#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

相关问题