通常如何避免重定义警告?
How do I generally avoid redefinition warnings?
我是宏观定义的新手,这就是为什么我通常想知道: 如何避免收到重新定义警告?
我不确定我是否正确,但我所知道的是: 宏定义是在头文件中进行的。如果我在源代码中包含多个具有相同宏定义的头文件,则会收到有关宏重新定义的警告。 一种解决方案是删除其中一个包含,以便只有一个宏定义。但是,如果我真的需要所有头文件才能让我的程序正常工作怎么办?
我也知道我可以检查宏是使用#ifdef还是#ifndef定义的,但是如何以及在何处插入这些检查?进入头文件?还是在我包含头文件之前和之后?
例如,我有两个警告,告诉我宏">__useHeader"和">__on_failure"被重新定义,那么我该如何避免这些 警告?
通常如何避免重定义警告?
正确的解决方案是在一个头文件中定义任何特定的宏 - 永远不要超过一个头。该标头当然必须使用包括后卫。
解决方案是删除其中一个包含
这是一种方法。如果您不需要该标头中的定义,则无论如何都不应包含它。
但是,如果我真的需要所有头文件才能让我的程序正常工作怎么办?
另一种方法是修改一个或两个头文件。
首先检查每个标头是否使用包含保护。如果没有,请添加一个。
如果两个标头都旨在引用同一个宏,则
从一个中删除宏定义 - 让它被A.h
- 并将仍然具有定义的宏定义 - 让它被B.h
- 包含在A.h
中。或者从两者中删除宏定义,并将其移动到第三个标头中,并包含两者中的宏定义。
或者,如果宏只是必须定义的东西,但值并不重要,那么在两个标头中,只有在尚未定义宏的情况下才定义宏。这可以通过
#ifndef
来实现
如果它们的宏具有不同的含义,并且命名是偶然的,则重命名其中一个宏。
如果您不希望修改任一标头,则必须接受这些标头文件彼此不兼容的事实。
如果您没有任何函数或依赖于两个标头(甚至间接)的类,则可以通过将依赖于一个标头的定义与依赖于另一个标头的定义分开来解决此问题。一旦一个定义依赖于这两个定义,就必须修复标头以实现兼容性。
通常,当可以使用变量或函数时,请避免使用宏定义。将这些变量和函数放入命名空间以避免名称冲突。
- 为什么我会收到警告,指出函数已使用但未定义,以及已定义但未使用?
- 在 eclipse 中,将宏重定义视为错误而不是警告
- G++ 编译器未为未定义的方法生成错误/警告
- 如何禁止在 g++ 中使用但从未定义警告的内联函数
- XCode 警告"此处需要实例化变量'Singleton:<Foo>:_instance',但没有可用的定义
- C++ 添加编译器警告,以错误使用自定义打印/日志功能
- 我正在尝试在我的类中创建一个静态成员,但编译器警告我它是未定义的
- 链接时突然收到maxrregcount警告和未定义的引用错误
- 避免对仅在源文件中定义的类发出弱 vtable 警告
- 警告定义朋友操作员在名称空间内声明
- 为什么方法重载或枚举标志定义会触发 gcc7.2 编译器警告?
- 是否有 GCC 标志来发出有关作用域内相同变量重定义的警告?
- 警告 C4661:没有为显式模板实例化请求提供合适的定义
- 通常如何避免重定义警告?
- 关于静态模板化 constexpr 的 Clang 警告(未定义内联函数)
- C 17 GCC编译器为什么会发出有关未定义的警告
- IntelliSense函数定义未找到QT信号的警告
- 宏重新定义警告
- 链接器不指出错误;多个定义警告指向同一行
- c++模板自定义警告