【问题标题】:How do I generally avoid redefinition warnings? [closed]我通常如何避免重新定义警告? [关闭]
【发布时间】:2017-03-31 09:57:07
【问题描述】:

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

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

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

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

【问题讨论】:

  • (a) 确保你使用了 include 守卫和 (b) 你可能需要用 #ifndef/#endif 括起来宏定义。
  • 首先,尽量避免使用宏。大多数时候在(现代)C++ 中它们并不是真正需要的。其次,请花点时间阅读What are the rules about using an underscore in a C++ identifier?。第三,为什么要在多个头文件中定义相同的宏?
  • 或者您是否在同一个translation unit 中多次包含同一个头文件,从而收到宏重新定义警告?那么你应该阅读include guards
  • #ifndef/#define 对是包含保护的最差选择,最好在每个.h 文件的开头使用#pragma once
  • @Someprogrammerdude 宏定义在 specstrings_supp.hsal_supp.h 所以我没有自己创建它们 - 结果我不能真正避免定义宏。我首先认为相同的宏定义在多个herader文件中,但显然我多次包含相同的头文件。 #pragma once 删除了警告。谢谢!

标签: c++ macros header-files redefinition


【解决方案1】:

我一般如何避免重定义警告?

正确的解决方案是在一个头文件中定义任何特定的宏——从不超过一个头文件。该标头当然必须使用包含守卫。

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

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

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

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

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

如果两个标题都指向同一个宏,那么

  • 从一个中删除宏定义 - 设为 A.h - 并将仍然具有定义的宏定义 - 设为 B.h - 到 A.h

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

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

  • 来实现

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


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

如果您没有任何函数或依赖于两个标题的类(甚至是间接依赖),那么您可以通过将依赖于一个标题的定义与依赖于其他标题。一旦一个定义依赖于两者,就必须修复标头以实现兼容性。


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-21
    • 2023-04-10
    • 1970-01-01
    • 2016-12-25
    • 2021-02-04
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    相关资源
    最近更新 更多