检查是否已经声明了#include
Checking whether #include is already declared
我正在尝试检查#include <file.h>
是否已经使用c++宏声明。
In file.h I do:
#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保护宏的正确包含。
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
- .cpp和.h文件中的模板专用化声明
- 未在作用域中声明unordered_map
- C++避免重复声明的语法是什么
- 如何确保C++函数在定义之前声明(如override关键字)
- 既然存在危险,为什么项目要使用-I include开关
- #include <string> 导致很多'<blank>'尚未声明错误
- 错误/usr/include/string.h:652:42:错误:生成caffe时未在此作用域中声明“memcpy”
- C++:与前向声明类和使用“#include”语句混淆
- 为什么使用前向声明而不是 #include 时会出现不完整的类型
- 如何避免在转发声明导致不完整类型错误时在头文件中 #include
- 如何为头文件声明“#include”以避免“error lnk2005”
- C++中include指令和forward声明之间的区别
- mErrCount:虽然在项目属性的include路径中声明了标识符,但未找到该标识符
- 避免递归(?)#include声明
- 在c++中使用#include访问在其他文件中声明的函数
- C/ c++前向声明vs. Include
- include和forward声明都有错误
- c++ include vs前向声明策略
- 对于c++中大量的私有类常量声明,任何不从另一个文件#include的理由
- 查找include比forward声明更好的用例