0

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

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

在 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)); \
}

还有一些其他的宏与这个非常相似。

4

1 回答 1

1

根据上面的评论,您似乎有 3 个选项:

  1. 忍受编译警告

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

  3. 考虑到它已经定义,考虑是否真的需要再次#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>

// ...
于 2012-10-08T17:50:04.433 回答