不兼容的宏重新定义

Incompatible redefinition of macro

当我用 make 命令编译我的 c 项目时,出现错误

Error: #47-D: incompatible redefinition of macro "MACRO_NAME"

看起来 MACRO_NAME 已在其中一个头文件中定义,但我想重新定义或硬编码 MACRO_NAME 的新值。

如何消除这个错误?

需要时使用#undef在头文件中重新定义MACRO

#ifdef MACRO_NAME
#undef MACRO_NAME
#endif
#define MACRO_NAME 100

没有明确的方法来定义这个宏,以便在另一个定义的含义中真正和可预测地不使用它。

如果您使用具有 undef 的机制,那么您 运行 有取消定义其他含义的风险,将其定义为您的含义,然后以期望其他含义看到和结束的代码结束用你的意思。

实现可靠性和可预测性的唯一方法是确保期望一种含义的代码不包含(既不直接也不间接)定义另一种含义的 header。

您可以通过

a) 以一种定义的方式进行定义,即当另一个定义已经定义时,两个定义都无法完成。为此,在这两种情况下

#ifdef MACRO_NAME
#error Separation of the two meanings of MACRO_NAME failed!
/* the other definition of MACRO_NAME is alreay visible */
#endif

#define MACRO_NAME MyMeaning

b) 确保没有代码包含这两个定义

实际上 a) 只是技术上的帮助,以确保 b)。如果您说您永远不会将这两个定义包含到一个代码文件中,那么您没有问题。在这种情况下,您不会从 a) 获得 #error。在那种情况下,使用错误的定义不会有问题。好的。你怎么知道的?你怎么能确定你没有问题,即使你更改代码,即使你的同事更改代码?使用a),那么当你陷入重定义陷阱时,你会被清楚地告知。如果您改用 #undef,那么您并没有阻止问题,只是隐藏它并使其更难调试。

c) 如果你只能影响两个定义中的一个,即另一个是另一个供应商的,最好的办法是改变你自己定义的名称。无论在您的代码中造成什么努力,都比被无意的重定义问题抓住要少。

d) 如果你不能影响这两个定义中的任何一个(这当然不是你问的情况)你必须将代码文件分成两组,那些使用一个定义而不是另一个和使用另一个定义且仅使用那个定义的组。