#undef, похоже, не влияет на переопределения макросов (предупреждение C4005)

Попытка исправить следующее предупреждение о «переопределении макроса»:

1>Path\to\MKL\include\math.h(1577): warning C4005: 'HUGE_VALF' : macro redefinition
1>        Path\to\Microsoft Visual Studio 12.0\VC\include\../../vc/include/math.h(104) : see previous definition of 'HUGE_VALF'

Сгенерировано из этого кода:

#include "ABC/CUDA_FFT.h"

#include "ABC/logging.h"
#include "Utilities/Utils.h"

#pragma warning( push )
#pragma warning( disable : 4005 ) // macro redefinition (no effect)
#include <cufft.h>
#include <cuda_runtime.h>
#pragma warning( pop )

#include <complex>

Макрос HUGE_VALF определен в обоих включенных файлах.

Я пытался #undef HUGE_VALF перед включением любого из вышеперечисленных заголовков, но все равно получал те же предупреждения.

Поскольку я должен использовать математические библиотеки Intel и Microsoft, как я могу предотвратить создание этого предупреждения?


person Pietro    schedule 11.02.2020    source источник


Ответы (1)


Если вам действительно нужно использовать две библиотеки с перекрывающимися именами идентификаторов (бедняжка, я чувствую вместе с вами), то единственный чистый способ — использовать их из отдельных файлов .c.
Т.е. создайте один файл .c, который включает заголовок для одной библиотеки, и второй файл .c, который включает заголовок другой библиотеки.
Таким образом следует решать проблемы с перекрывающимися определениями макросов.

Если у вас дополнительно есть перекрывающиеся идентификаторы компоновщика (имена функций, имена глобальных переменных...), то необходимо будет отдельно связать два файла кода с соответствующими библиотеками.

Настоящие проблемы начинаются, если вам затем приходится использовать функциональные возможности обеих библиотек в одной написанной вами функции. Для этого потребуется сначала обернуть две функции в функции с уникальными именами в соответствующих файлах кода, которые затем можно будет однозначно вызывать из другого файла кода, чтобы использовать обе.

Не пытайтесь решить свою проблему с помощью #undef, это всего лишь способ рискнуть (или, согласно закону Мерфи, гарантировать), что неожиданно будет использовано неправильное определение перекрывающихся имен макросов.

Короче говоря, если вы думаете, что #undef может вам помочь, то ваша проблема серьезнее, чем вы думаете.

Это может показаться циничным, пожалуйста, поймите, что я только пытаюсь дать вам возможность извлечь выгоду из некоторых серьезных ожогов, которые я сделал. Отладка при наличии нечисто перекрывающихся символов приведет к ожогу. Как я упоминал в своем профиле, я научился суеверно считать #undef неудачником.

Но, чтобы также ответить на фактический вопрос, который вы написали, чтобы избавиться от симптома «переопределения» (не проблемы, заметьте), вам нужно сделать #undef МЕЖДУ двумя включениями, а не раньше. Таким образом, первое включение определяет проблемный макрос. Затем он становится неопределенным. Затем второе включение определяет его снова, не видя, что оно уже определено.

person Yunnosch    schedule 11.02.2020