Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 宏定义冲突_C++_Macros - Fatal编程技术网

C++ 宏定义冲突

C++ 宏定义冲突,c++,macros,C++,Macros,我遇到了这个问题。这与宏函数无关,只是简单的字符串值宏替换 我有两个头文件 test1.h #define TEST 123 test2.h #define TEST 456 现在我有一个包含这两个标题的程序,但我希望我的实际测试是123。 如何避免将TEST定义为456 您可能认为我不简单地更改宏是疯了,但情况是:我有一个第三方解码器,它有这个宏(在test1.h中定义),还有另一个WINAPI宏(在test2.h中定义)。这两个文件都由其他人控制;我不应该改变他们中的任何一个。 我根本不需

我遇到了这个问题。这与宏函数无关,只是简单的字符串值宏替换

我有两个头文件

test1.h
#define TEST 123
test2.h
#define TEST 456
现在我有一个包含这两个标题的程序,但我希望我的实际测试是123。 如何避免将TEST定义为456

您可能认为我不简单地更改宏是疯了,但情况是:我有一个第三方解码器,它有这个宏(在test1.h中定义),还有另一个WINAPI宏(在test2.h中定义)。这两个文件都由其他人控制;我不应该改变他们中的任何一个。 我根本不需要test2.h,但我想它是由其他WINAPI头隐式包含的

那么,谁能告诉我如何解决这个问题?要用我的第三方宏覆盖WINAPI宏?或者如何在我自己的代码中取消WINAPI头中的定义?有没有办法指定我不想包含的标题。

您可以使用
#ifdef
预处理器指令来确定是否已经为您的特定情况定义了
测试。或者干脆先取消定义

#undef TEST
#define TEST 123

将它放在头文件中,您希望
TEST
为123而不是456。此外,这需要在包含
test2.h
之后和包含
test1.h
之前进行
。不过,这有点像黑客,因为您无法修复宏名称。

如果将两个头都包含到文件中,则可以取消定义为:

#ifdef TEST
#undef TEST
#define TEST 123
#endif
//yourfile.cpp

#include "test2.h"  //include this before test1.h

#undef TEST   //this undefines the macro defined in test2.h 

#include "test1.h"  //now this defines a macro called TEST which you need
试试这个:

#include "test2.h"
#undef TEST
#include "test1.h"

首先包括test2,放弃它的
测试,然后包括test1。

在包含之后,您可以在代码中重新定义它。这将再次重新定义它,使它在需要它的任何地方都具有正确的值。否:
\undef TEST
\define TEST 123
就足够了。否:
\undef TEST
\define TEST 123
就足够了。它可以工作!谢谢你!我不知道有一个未定义的,现在我知道了。