c-宏的重新定义不兼容



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

错误:#47-D:宏"macro_NAME"的重新定义不兼容

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

如何删除此错误?

没有一种干净的方法来定义这个宏,这样当一个定义是指另一个定义时,它就不会以可预测的方式用于其中一个定义的含义。

如果你使用undef的机制,那么你就有风险去定义另一个意义,根据你的意义来定义它,然后最终得到期望另一个含义看到并使用你的意义的代码。

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

你可以通过

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( 如果你不能影响这两个定义中的任何一个(这当然不是你所问的情况(,你必须将代码文件分为两组,一组使用一个定义,另一组使用另一个定义。

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

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

最新更新