我试图检查是否已经使用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
指令,但没有喜悦。有人知道如何实现这一点吗?
6条答案
按热度按时间ibps3vxo1#
其他人已经介绍了正确包含include guard宏。
文件. h
但其他人都没听到你关于正确用法的第二部分问题:
这是一个错误用法的例子:
这是不正确的(虽然正确可能太强)。
每个文件中的include保护都应该包围它们的整个内容,因此,在第二个文件中,
#include "file.h"
应该在include保护之内。此外,您不需要测试包含性,这将在文件本身内部完成。因此,文件应该如下所示:
而且你的宏保护器太小了,很有可能被其他人使用;这会引起各种各样奇怪的碰撞。
一个好的方法是使用前缀,你的全名(或昵称),或者如果你有自己的注册网站,然后使用它的域名。然后我还添加了包括文件的目录层次结构的一部分。
另一种方法(特别是在Windows上工作时)是生成GUID,只需为每个文件生成一个新的GUID。
最后一点:如果绝对需要头文件中的其他文件,则只包含这些文件。如果该文件具有类second依赖的类型定义,则只需要包含“file.h”。如果类只将该类用作指针或引用,则最好使用前向声明,而不是包含头文件。
必须使用
#include
的情况包括:objects
的成员objects
作为参数objects
作为结果的方法注意我使用了术语“对象”。如果它们是引用或指针,那么这不算。在这些情况下,你可以使用前向声明来解决问题。
2guxujil2#
在文件.h中:
然后检查file. h是否包含在:
fcy6dtqo3#
在文件头中使用
#ifndef FILE_H
行的原因很简单,就是为了使文件在第二次或更多次包含时是空操作的,这些#行放在一起称为“include guard”。因此,简单地执行
#include "file.h"
就已经完成了您在第二个文件中尝试执行的操作。(预处理器可能会在丢弃文件内容之前打开并读取该文件,但可以合理地假设它在缓存中,因此在一般情况下编译器性能不会提高。如果你抱怨一个文件没有被包含,你可以自己包含它。也许你想禁止一个文件被包含,当另一个文件被包含,所以他们是非此即彼;或者严格的包含顺序(可能是设计问题的症状)。或者当一些东西已经(没有)被包含时使用替代代码。
在这种情况下,
#ifdef X
或#ifndef X
将起作用,其中X与包含保护中使用的内容匹配。mklgxw1f4#
在文件. h中
但是,如果您多次包含
file.h
,则会导致程序无法编译。这将防止由于多个包含而导致的编译错误/警告。
iovurdzv5#
执行此类操作的典型方法是:
这将防止同一个标头被多次包含。
tsm1rwdh6#
所有的答案都包括在内。对于有多个include的大型项目,这只是一个提示,在include之前使用#define FILE_H是很重要的。否则你会递归地得到错误。例如