宏定义冲突

4

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

我有两个头文件

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

现在我有一个程序包含了这两个头文件,但是我希望我的实际测试结果是123。如何避免将TEST定义为456?
你可能认为我很疯狂,不直接更改宏,但情况是:我有一个第三方解码器,其中有这个宏(在test1.h中定义),还有另一个WINAPI宏(在test2.h中定义)。这两个文件都由其他人控制,我不应该更改它们中的任何一个。 我根本不需要test2.h,但我想它可能被某些其他WINAPI头文件隐式包含。
那么,请问有谁能告诉我如何解决这个问题?如何用我的第三方宏覆盖WINAPI宏?或者如何在自己的代码中使WINAPI头文件的定义失效?是否有一种方法可以指定不想要包含哪个头文件?

你可以在包含语句之后重新定义它。这将再次重新定义它,以便它在需要时具有正确的值。 - Patrick87
5个回答

5

您可以使用#ifdef预处理器指令来确定TEST是否已经对您的特定情况进行了定义。或者先使用#undef取消定义。

#undef TEST
#define TEST 123

将以下代码放入您想要 TEST 为 123 而不是 456 的头文件中。此外,这需要在 test1.h 之前。


不需要其他操作,只需执行 #undef TEST#define TEST 123 即可。 - Jonathan Leffler
它可行了!谢谢!我不知道还有 #undef,现在我懂了。 - joeyzhao

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

2
在包含test1.h之前,包含test2.h后使用#undef TEST。这有点hack,因为无法修复宏名称。

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

不需要其他的,只要 #undef TEST#define TEST 123 就足够了。 - Jonathan Leffler

1

试试这个:

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

首先包含test2,删除其TEST,然后包含test1。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接