通常如何避免重定义警告?

How do I generally avoid redefinition warnings?

本文关键字:定义 警告 常如何      更新时间:2023-10-16

我是宏观定义的新手,这就是为什么我通常想知道: 如何避免收到重新定义警告?

我不确定我是否正确,但我所知道的是: 宏定义是在头文件中进行的。如果我在源代码中包含多个具有相同宏定义的头文件,则会收到有关宏重新定义的警告。 一种解决方案是删除其中一个包含,以便只有一个宏定义。但是,如果我真的需要所有头文件才能让我的程序正常工作怎么办?

我也知道我可以检查宏是使用#ifdef还是#ifndef定义的,但是如何以及在何处插入这些检查?进入头文件?还是在我包含头文件之前和之后?

例如,我有两个警告,告诉我宏">__useHeader"和">__on_failure"被重新定义,那么我该如何避免这些 警告?

通常如何避免重定义警告?

正确的解决方案是在一个头文件中定义任何特定的宏 - 永远不要超过一个头。该标头当然必须使用包括后卫。

解决方案是删除其中一个包含

这是一种方法。如果您不需要该标头中的定义,则无论如何都不应包含它。

但是,如果我真的需要所有头文件才能让我的程序正常工作怎么办?

另一种方法是修改一个或两个头文件。

首先检查每个标头是否使用包含保护。如果没有,请添加一个。

如果两个标头都旨在引用同一个宏,则

从一个中删除宏定义 - 让它被
  • A.h- 并将仍然具有定义的宏定义 - 让它被B.h- 包含在A.h中。

  • 或者从两者中删除宏定义,并将其移动到第三个标头中,并包含两者中的宏定义。

  • 或者,如果宏只是必须定义的东西,但值并不重要,那么在两个标头中,只有在尚未定义宏的情况下才定义宏。这可以通过#ifndef来实现

如果它们的宏具有不同的含义,并且命名是偶然的,则重命名其中一个宏。


如果您不希望修改任一标头,则必须接受这些标头文件彼此不兼容的事实。

如果您没有任何函数或依赖于两个标头(甚至间接)的类,则可以通过将依赖于一个标头的定义与依赖于另一个标头的定义分开来解决此问题。一旦一个定义依赖于这两个定义,就必须修复标头以实现兼容性。


通常,当可以使用变量或函数时,请避免使用宏定义。将这些变量和函数放入命名空间以避免名称冲突。