我遇到了这个问题。这不是关于宏函数,只是简单的字符串值宏替换。
我有两个头文件
test1.h
#define TEST 123
test2.h
#define TEST 456
现在我有一个程序包含这两个标题,但我希望我的实际TEST为123。 如何避免将TEST定义为456?
你可能会觉得我疯了,不是简单地改变宏,但情况是:我有一个第三方解码器,它有这个宏(在test1.h中定义),还有另一个WINAPI宏(在test2.h)。这两个文件都是由其他人控制的;我不应该改变他们中的任何一个。 我根本不需要test2.h,但我猜它被其他一些WINAPI标头隐含地包含在内。
那么,有谁能告诉我如何解决这个问题?用我的第三方宏覆盖WINAPI宏?或者如何在我自己的代码中从WINAPI标头中取消定义?有没有办法指定我不想包含哪个标题。
答案 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。