不兼容的宏重新定义

时间:2019-11-21 19:24:59

标签: c macros arm redefinition

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

  

错误:#47-D:宏“ MACRO_NAME”的重新定义不兼容

其中一个头文件中似乎已经定义了MACRO_NAME,但我想为MACRO_NAME重新定义或硬编码新值。

如何清除此错误?

2 个答案:

答案 0 :(得分:3)

没有一种明确的方法来定义此宏,以致于不能真正地和可预测地将其用于一种定义的含义,而另一种则意味着这种含义。

如果您将机制与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)如果您不能影响两个定义中的任何一个(当然不是您要询问的情况),则必须将代码文件分为两组,即使用一个定义而不使用另一个的以及使用其他定义且仅使用该定义的组。

答案 1 :(得分:0)

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

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