回答
你不能做你想做的事情。如果你不想头包括你的选择是
不包括它摆在首位
有条件地包含或不通过prepocessor例如
#ifdef INC_MY_HEADER
#include "myheader.h"
#endif
或假设头部具有头部防护装置,只是在包含头部之前定义头部防护装置,从称道线-DMY_HEADER或类似
如果真正的问题是,你必须定义具有相同名称的东西不同的页眉,那么你可能需要考虑namespaces所以你没有得到冲突
'包括'c/C++中的东西实质上是指:将preprocessor复制并直接将#include <file>
粘贴到您的源代码(或更好:源代码的预处理版本)中。
您无法将该复制和粘贴操作撤消。你可以'#undef'通过复制和粘贴动作引入的东西,但是你必须为你不喜欢的每个原子做这个事情,你无法#undef整个文件。
要检查,如果已经包含给定的头文件,则检查是否已经定义了来自该头文件的文件。大多数标题包含所谓的“卫士”,这看起来像
#ifndef FOO_H
#define FOO_H
/* lots of code */
#endif
一个名为“foo.h中”文件。你可以检查这样的“FOO_H”:
#ifdef FOO_H
/* do your magic */
#endif
例如:
foo.h:
#ifndef FOO_H
#define FOO_H
struct Foo { /* ... * };
#endif
bar.h:
#include "foo.h"
#ifdef FOO_H
#undef Foo
#endif
,但如果你不知道究竟你是这样做会导致很多麻烦。如果你真正的问题是,你的编译器抱怨'已经声明的东西',那么你没有防范你的头文件多个包含...
你的意思是你想要确保头文件包含一次只有一次?标准解决方案是使用包括后卫。
I.e.围绕您的标题的内容与
#ifndef MY_HEADER // a unique identifier for each header
#define MY_HEADER
...
#endif
这是保证在所有平台上都能正常工作。某些编译器还提供#pragma
以获得相同的效果,并减少了麻烦。在Visual C++中,您可以添加
#pragma once
位于头文件的开头。
#undef
与#define
相反,实际上取消了它。
当你需要一个宏观的一些任务,但不希望“污染”的符号表
// referencing FOO is an error (not yet defined)
#define FOO(arg_) ....
FOO(A)
FOO(B)
FOO(C)
#undef FOO
// referencing FOO now is an error (not defined)
没有办法取消#include
指令这是非常有用的。
你可以停止包含头文件 - 最简单的方法是删除或注释掉#include
指令。
您还可以预先定义您的警卫,以便包含无效。
foo.h
#ifndef __FOO_H
#define __FOO_H
/* contents of foo.h */
#endif /* __FOO_H */
foo.cpp
#define __FOO_H
#include "foo.h"
/* contents of foo.cpp */
使用这种策略,你可以使用预处理程序选择是否预先定义的后卫,甚至有内部警卫在你头。
如果你真的只需要包含部分文件,最好将文件分成两部分。
- 1. 在C++中包含标题时未定义的引用
- 2. 错误2061 - 当我包含标题时,类变成“未定义”
- 3. 自定义标题栏与包含标题的布局
- 4. fstream包含但“ifstream未找到”和“标识符未定义”
- 5. protobuf-net扩展:“已包含定义”
- 6. 不包含GetDataFromNumber的定义但是我已经定义了它?
- 7. F_SEAL_SEAL未声明,即使包含标题
- 8. 标准包含std C++库之后未定义的符号
- 9. EJS.JS ReferenceError:未定义标题
- 10. btn.attr(“标题”)未定义
- 11. '标签'不包含'ForeColor'的定义。
- 12. 定义包含“
- 13. PHP包含/未定义变量
- 14. 包含socket.io.js导致未定义'require'
- 15. 标识符'n'未定义,'object'不包含此类成员
- 16. “标签不包含文本定义”
- 17. Django自定义包含标签
- 18. viewmodel问题,“不包含定义”
- 19. 标题包含问题
- 20. 不含定义为“包含”
- 21. 未定义的属性:stdClass的:: $标题
- 22. 在活动中包含布局和自定义标题
- 23. PyInstaller未能包含图标
- 24. 未定义的方法'标题'
- 25. 已包含Xcode库,但未找到?
- 26. 不包含'GetAwaiter'的定义
- 27. 不包含“foo”的定义
- 28. 标记已定义的定义列表
- 29. 已包含类
- 30. 命名空间'x'已包含'FixupCollection'的定义
标题无法定义或未定义。你的意思是不定义一个以前的`#define`d值?那里有`#undef`指令。 – templatetypedef 2011-02-16 08:58:25
如何使用#undef。我想取消定义#include“abc.h” – Sijith 2011-02-16 09:00:41
也许你可以提供一个例子吗? – Nick 2011-02-16 09:01:56