Я продолжаю получать предупреждения только в XCode о переопределении некоторых макросов в glm. это не большая проблема, но меня раздражают предупреждения.
Если я поставлю блок #ifndef поверх макросов виновника, но тогда вся система не будет работать? Я включаю их в статическую библиотеку, которая связана с приложением, которое также включает их. Я думал, что это может быть проблемой, поэтому я удалил его из одного из двух, чтобы посмотреть, помогло ли это. Это не так.
Это предупреждение не появляется при использовании mingw g ++ в Windows, но оно появляется в 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 варианта:
Просто жить с предупреждениями компиляции
Измените расположение вашего макроопределения VECTORIZE2_VEC относительно # include, так как другое определение VECTORIZE2_VEC не заключило его в #ifndef (и это вызывает предупреждение компиляции)
Подумайте, действительно ли вам нужно # определить это снова, учитывая, что оно уже определено.
Вариант 1 приемлем, но если у вас есть требование «нет предупреждения о компиляции», что на самом деле хорошо, то вам придется использовать вариант 2 (который, на мой взгляд, может стать сложным для поддержки) или 3.
Для реализации варианта 2 вам необходимо определить макрос после включить, где он изначально определен, но до другие # включают, которые нуждаются в этом. Это может оказаться невозможным, если вы получите исходное определение и ошибку компиляции, включив всего один файл, в этом случае вам не повезло.
Предполагая, что file1.h имеет исходное определение VECTORIZE2_VEC, а file2.h нуждается в определении и вызывает ошибку компиляции при его отсутствии, следующее может решить проблему и избавиться от ошибок и предупреждений:
#include <file1.h>
#ifdef VECTORIZE2_VEC
#undef VECTORIZE2_VEC
#endif
#define VECTORIZE2_VEC(func) ....
#include <file2.h>
// ...
Других решений пока нет …