Glm VECTORIZE2_VEC重新定义了XCode警告

Glm VECTORIZE2_VEC redefined XCode warning

本文关键字:定义 XCode 警告 VECTORIZE2 VEC 新定义 Glm      更新时间:2023-10-16

我只在XCode中收到关于glm中某些宏被重新定义的警告。这不是一个大问题,但我觉得警告很烦人。

如果我在罪魁祸首宏上放了一个#ifndef块,但整个系统都无法工作?我将它们包含在一个静态库中,该库链接到一个也包含它们的应用程序。我认为这可能是问题所在,所以我把它从其中一个中删除了,看看它是否有帮助。它没有。

在windows上使用mingw g++时不会出现此警告,但在Xcode 4中会出现。我使用的是glm 0.9.3.4版本。

警告:

"VECTORIZE2_VEC" redefined
This is the location of the previous definition

这种情况重复了数百次。

Culprit代码(取自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个选项:

  1. 只接受编译警告

  2. 更改VECTORIZE2_VEC宏定义相对于#include的位置,因为VECTORIze 2_VEC的另一个定义没有将其封装在#ifndef中(这会导致编译警告)

  3. 考虑到它已经定义好了,考虑一下是否真的需要再次#定义它。

选项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>
// ...