0

尝试修复以下“宏重新定义”警告:

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 数学库,如何防止生成此警告?

4

1 回答 1

2

如果你真的必须使用两个标识符名称重叠的库(可怜的你,我和你一样),那么唯一干净的方法是从单独的 .c 文件中使用它们。
即制作一个.c 文件,其中包含一个lib 的标头,另一个.c 文件包含另一个lib 的标头。
应该以这种方式解决重叠宏定义的问题。

如果您还有重叠的链接器标识符(函数名、全局变量名...),则有必要将两个代码文件分别链接到相应的库。

如果您必须在您编写的一个函数中使用两个库中的功能,那么真正的麻烦就开始了。这将需要首先将这两个功能包装在相应代码文件中唯一命名的函数中,然后可以从另一个代码文件中明确调用它们以使用两者。

不要试图#undef用 .

简而言之,如果您认为这#undef可以帮助您,那么您的问题比您意识到的要大。

这可能看起来很愤世嫉俗,请理解我只是想让您从我所做的一些严重的焦痕体验中受益。在存在不干净的重叠符号的情况下进行调试会让你感到厌烦。正如我在个人资料中提到的,我学会了迷信#undef地认为不走运。

但是,要回答您写的实际问题,要摆脱“重新定义”症状(不是问题,请注意),您需要#undef在两者之间进行,而不是之前。这样,第一个包含定义了有问题的宏。然后它变得不确定。然后第二个包含再次定义它,而没有看到它已经被定义。

于 2020-02-11T18:16:26.667 回答