C语言 取消定义已包含的标题

b1uwtaje  于 2023-11-16  发布在  其他
关注(0)|答案(6)|浏览(147)

我想在我的源文件中检查一个头,如果它已经定义了,我想取消定义。
这可能吗?

mzaanser

mzaanser1#

#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指令。

jogvjijk

jogvjijk2#

你不能做你看起来想做的事情。如果你不想包含标题,你的选择是
一开始就不包括它
有条件地包括它或不通过前置器,例如。

#ifdef INC_MY_HEADER
#include "myheader.h"
#endif

字符串
或者假设报头具有报头保护,则在包括报头之前仅定义报头保护,例如,从命令行-DMY_HEADER或类似行
如果真实的问题是您有不同的头文件定义相同名称的东西,那么您可能需要查看namespaces,这样就不会发生冲突

rbl8hiat

rbl8hiat3#

c/c++中的“including”本质上意味着:让preprocessor直接复制并粘贴#include <file>到源代码中(或者更好:源代码的预处理版本)。
你不能使复制和粘贴动作撤消.你可以然而'#undef'的东西引入的复制和粘贴动作,但你必须这样做的每一个原子你不喜欢,你只是不能#undef整个文件.
要检查,如果一个给定的头文件已经被包含,你必须检查从那个头文件中的东西是否已经被定义.大多数头文件包含所谓的'guards',看起来像

#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


但是如果你不知道你到底在做什么,这会导致很多头痛。如果你的真实的问题是,你的编译器抱怨“已经声明的东西”,那么你就没有保护你的头文件不受多重包含的影响.

7vhp5slm

7vhp5slm4#

你的意思是你想**确保头文件被包含一次且只包含一次?**标准的解决方案是使用一个 * 包含保护 *。
也就是说,在标题的内容周围加上

#ifndef MY_HEADER // a unique identifier for each header
#define MY_HEADER

...

#endif

字符串
这保证在所有平台上都能工作。一些编译器还提供了#pragma来实现相同的效果,而不那么麻烦,例如在Visual C++中,您可以添加

#pragma once


在头文件的开头。

cigdeys3

cigdeys35#

您可以停止包含头文件-最简单的方法是删除或注解掉#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 */

字符串
使用这种策略,您可以使用预处理器来选择是否预定义保护,甚至在头中使用内部保护。
如果您真的只需要包含文件的一部分,最好将文件分成两部分。

csga3l58

csga3l586#

1、要自动避免重新包含一些东西,就像之前的评论说的那样。
2、要检查一个头文件是否包含,可以如下:
a_header_file.h

#ifdef __A_HEADER_FILE__
#define A_HEADER_FILE_DEFINED
...
#endif // #ifdef __A_HEADER_FILE__

字符串
a_source_file.c

...
#ifdef A_HEADER_FILE_DEFINED
/* it's defined */
#endif
...

相关问题