我一直只在 XCode 中收到有关 glm 中某些宏被重新定义的警告。这不是一个大问题,但我发现警告很烦人。
如果我在罪魁祸首的宏上放置一个#ifndef block ,那么整个系统将无法工作?我将它们包含在一个静态库中,该库链接到一个也包含它们的应用程序。我虽然这可能是问题所在,但我将其从两者之一中删除,以查看是否有帮助。它没有。
在 Windows 上使用 mingw g++ 时不会出现此警告,但在 Xcode 4 中会出现。我使用的是 glm 版本 0.9.3.4。
警告:
"VECTORIZE2_VEC" redefined
This is the location of the previous definition
这重复了数百次。
罪魁祸首代码(取自 glm 文件 _vectorize.hpp):
#define VECTORIZE2_VEC(func) \
template <typename T> \
GLM_FUNC_QUALIFIER detail::tvec2<T> func( \
detail::tvec2<T> const & v) \
{ \
return detail::tvec2<T>( \
func(v.x), \
func(v.y)); \
}
还有一些其他的宏与这个非常相似。
最佳答案
根据上面的评论,您似乎有 3 个选择:
接受编译警告
相对于 #include 更改 VECTORIZE2_VEC 宏定义的位置,因为 VECTORIZE2_VEC 的其他定义没有将其包装在 #ifndef 中(这会导致编译警告)
<考虑到它已经定义,考虑是否真的需要再次#define。
选项 1 没问题,但如果您有“无编译警告”要求,这实际上是一件好事,那么您将不得不选择选项 2(我认为这可能变得难以维护)或 3 .
要实现选项 2,您需要在包含最初定义的位置之后定义宏,但之前 其他#include 需要它。这可能是不可能的,如果您仅通过#include 一个文件获得原始定义和编译错误,在这种情况下您就不走运了。
假设 file1.h 具有原始的 VECTORIZE2_VEC 定义,而 file2.h 需要该定义并在其缺失时导致编译错误,以下可以解决该问题并且不会出现错误和警告:
#include <file1.h>
#ifdef VECTORIZE2_VEC
#undef VECTORIZE2_VEC
#endif
#define VECTORIZE2_VEC(func) ....
#include <file2.h>
// ...
关于c++ - Glm VECTORIZE2_VEC 重新定义 XCode 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12786070/