#undef, похоже, не влияет на переопределения макросов (предупреждение C4005) - PullRequest
0 голосов
/ 11 февраля 2020

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

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, как я могу предотвратить это предупреждение сгенерировано?

1 Ответ

1 голос
/ 11 февраля 2020

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

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

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

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

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

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

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

...