宏定义冲突

时间:2011-08-18 15:14:20

标签: c++ macros

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

我有两个头文件

test1.h
#define TEST 123
test2.h
#define TEST 456

现在我有一个程序包含这两个标题,但我希望我的实际TEST为123。 如何避免将TEST定义为456?

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

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

5 个答案:

答案 0 :(得分:3)

您可以使用#ifdef预处理器指令来确定是否已针对您的特定情况定义TEST。或者首先#undef

#undef TEST
#define TEST 123

将它放在您希望TEST为123而不是456的头文件中。此外,这需要在test1.h之前。

答案 1 :(得分:2)

#undef TEST的包含之后和test2.h的包含之前

test1.h。这有点像黑客,因为你无法修复宏名称。

答案 2 :(得分:2)

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

//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

答案 3 :(得分:1)

#ifdef TEST
#undef TEST
#define TEST 123
#endif

答案 4 :(得分:1)

试试这个:

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

首先包括test2,丢弃其TEST,然后包含test1。