我想在我的源文件中检查一个头,如果它已经定义了,我想取消定义。这可能吗?
mzaanser1#
#undef与#define相反,实际上抵消了它。当你需要一个宏来完成某些任务,但又不想“污染”符号表时,
#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
jogvjijk2#
你不能做你看起来想做的事情。如果你不想包含标题,你的选择是一开始就不包括它有条件地包括它或不通过前置器,例如。
#ifdef INC_MY_HEADER #include "myheader.h" #endif
字符串或者假设报头具有报头保护,则在包括报头之前仅定义报头保护,例如,从命令行-DMY_HEADER或类似行如果真实的问题是您有不同的头文件定义相同名称的东西,那么您可能需要查看namespaces,这样就不会发生冲突
rbl8hiat3#
c/c++中的“including”本质上意味着:让preprocessor直接复制并粘贴#include <file>到源代码中(或者更好:源代码的预处理版本)。你不能使复制和粘贴动作撤消.你可以然而'#undef'的东西引入的复制和粘贴动作,但你必须这样做的每一个原子你不喜欢,你只是不能#undef整个文件.要检查,如果一个给定的头文件已经被包含,你必须检查从那个头文件中的东西是否已经被定义.大多数头文件包含所谓的'guards',看起来像
#include <file>
#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
型但是如果你不知道你到底在做什么,这会导致很多头痛。如果你的真实的问题是,你的编译器抱怨“已经声明的东西”,那么你就没有保护你的头文件不受多重包含的影响.
7vhp5slm4#
你的意思是你想**确保头文件被包含一次且只包含一次?**标准的解决方案是使用一个 * 包含保护 *。也就是说,在标题的内容周围加上
#ifndef MY_HEADER // a unique identifier for each header #define MY_HEADER ... #endif
字符串这保证在所有平台上都能工作。一些编译器还提供了#pragma来实现相同的效果,而不那么麻烦,例如在Visual C++中,您可以添加
#pragma
#pragma once
型在头文件的开头。
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 */
字符串使用这种策略,您可以使用预处理器来选择是否预定义保护,甚至在头中使用内部保护。如果您真的只需要包含文件的一部分,最好将文件分成两部分。
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 ...
型
6条答案
按热度按时间mzaanser1#
#undef
与#define
相反,实际上抵消了它。当你需要一个宏来完成某些任务,但又不想“污染”符号表时,
字符串
没有办法取消
#include
指令。jogvjijk2#
你不能做你看起来想做的事情。如果你不想包含标题,你的选择是
一开始就不包括它
有条件地包括它或不通过前置器,例如。
字符串
或者假设报头具有报头保护,则在包括报头之前仅定义报头保护,例如,从命令行-DMY_HEADER或类似行
如果真实的问题是您有不同的头文件定义相同名称的东西,那么您可能需要查看namespaces,这样就不会发生冲突
rbl8hiat3#
c/c++中的“including”本质上意味着:让preprocessor直接复制并粘贴
#include <file>
到源代码中(或者更好:源代码的预处理版本)。你不能使复制和粘贴动作撤消.你可以然而'#undef'的东西引入的复制和粘贴动作,但你必须这样做的每一个原子你不喜欢,你只是不能#undef整个文件.
要检查,如果一个给定的头文件已经被包含,你必须检查从那个头文件中的东西是否已经被定义.大多数头文件包含所谓的'guards',看起来像
字符串
对于一个名为'foo. h'的文件。你可以像这样检查'FOO_H':
型
举例说明:
型
但是如果你不知道你到底在做什么,这会导致很多头痛。如果你的真实的问题是,你的编译器抱怨“已经声明的东西”,那么你就没有保护你的头文件不受多重包含的影响.
7vhp5slm4#
你的意思是你想**确保头文件被包含一次且只包含一次?**标准的解决方案是使用一个 * 包含保护 *。
也就是说,在标题的内容周围加上
字符串
这保证在所有平台上都能工作。一些编译器还提供了
#pragma
来实现相同的效果,而不那么麻烦,例如在Visual C++中,您可以添加型
在头文件的开头。
cigdeys35#
您可以停止包含头文件-最简单的方法是删除或注解掉
#include
指令。你也可以预先定义你的守卫,这样包含就无效了。
字符串
使用这种策略,您可以使用预处理器来选择是否预定义保护,甚至在头中使用内部保护。
如果您真的只需要包含文件的一部分,最好将文件分成两部分。
csga3l586#
1、要自动避免重新包含一些东西,就像之前的评论说的那样。
2、要检查一个头文件是否包含,可以如下:
a_header_file.h
字符串
a_source_file.c
型