我想检查源文件中的标题,如果已定义,我想取消它。
有可能吗?
答案 0 :(得分:1)
'包含'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
如果您不知道自己到底在做什么,那可能会导致很多麻烦。如果您真正的问题是,您的编译器抱怨“已经声明的东西”,那么您不会在多个包含中保护您的头文件......
答案 1 :(得分:1)
您是说要确保头文件只包含一次吗?标准解决方案是使用 include guard 。
即。用
包围标题的内容#ifndef MY_HEADER // a unique identifier for each header
#define MY_HEADER
...
#endif
这保证适用于所有平台。一些编译器还提供#pragma
以实现相同的效果,减少麻烦,例如在Visual C ++中,您可以添加
#pragma once
在头文件的开头。
答案 2 :(得分:1)
#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
指令。
答案 3 :(得分:0)
你无法做你想做的事。如果您不希望包含的标题是您的选择
首先不要包含它
通过预处理器有条件地包括它,例如
#ifdef INC_MY_HEADER
#include "myheader.h"
#endif
或假设标题具有标题保护仅在包括标题之前定义标题保护,例如来自推荐行-DMY_HEADER或类似的
如果真正的问题是你有不同的标题来定义具有相同名称的东西,那么你可能需要调查namespaces,这样你就不会发生冲突
答案 4 :(得分:0)
您可以停止包含标题 - 最简单的方法是删除或注释掉#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 */
使用此策略,您可以使用预处理器选择是否预先定义防护,或者甚至在头部内部设置内部防护。
如果你真的只需要包含部分文件,最好将文件分成两部分。