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

时间:2017-03-31 09:57:07

标签: c++ macros header-files redefinition

我是宏定义的新手,这就是我一般想知道的原因: 如何避免获得重新发布警告?

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

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

作为示例,我有两个警告告诉我宏<“strong> __ useHeader ”和“ __ on_failure ”被重新定义,所以我该如何避免这些 警告?

1 个答案:

答案 0 :(得分:1)

  

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

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

  

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

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

  

但是,如果我真的需要所有头文件让我的程序正常工作呢?

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

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

如果两个标题都是为了引用同一个宏,那么

  • 从一个中移除宏定义 - 让它为A.h - 并包含仍然具有定义的宏定义 - 将其B.h - 转换为A.h

  • 或者从两者中删除宏定义,并将其移动到第三个标题中,并将其包括在内。

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

  • 来实现

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

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

如果您没有任何功能,或者某个类依赖于两个标题(甚至是间接标题),那么您可以通过在不同的翻译单元中分离依赖于一个标题的定义来解决问题。在另一个标题上。只要一个定义依赖于两者,就必须修复标头以保持兼容性。

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