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

How do I generally avoid redefinition warnings?

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

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

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

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

How do I generally avoid redefinition warnings?

正确的解决方案是在一个 header 文件中定义任何特定的宏 - 永远不要超过一个 header。 header 当然必须使用 include 守卫。

A solution would be the removal of one of the includes

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

But what if I really need all the header files to let my program work correctly?

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

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

如果两个 header 都指的是同一个宏,那么

  • 从一个中删除宏定义 - 让它成为 A.h - 并将仍然具有定义的那个 - 让它成为 B.h - 包含到 A.h.

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

  • 或者,如果宏只是必须定义的东西,但值并不重要,那么在两个 header 中只定义宏,如果它没有已经被定义。这可以通过 #ifndef

  • 来实现

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


如果您不想修改任何一个 header,那么您必须接受这些 header 文件彼此不兼容的事实。

如果您没有任何函数,或者 class 依赖于两个 header(甚至是间接的),那么您可以通过分离依赖于一个的定义来解决这个问题header 在独立的翻译单元中,而不是依赖于另一个 header 的定义。一旦一个定义依赖于两者,就必须修复 headers 以实现兼容性。


一般来说,当可以使用变量或函数代替时,避免使用宏定义。将这些变量和函数放入命名空间以避免名称冲突。