#undef 似乎对宏重新定义没有影响(警告 C4005)

#undef seems to have no effect on macro redefinitions (warning C4005)

正在尝试修复以下 "macro redefinition" 警告:

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 在包含上述任何内容之前 headers,但我仍然收到相同的警告。

由于我必须同时使用 Intel 和 Microsoft 数学库,我该如何防止生成此警告?

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

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

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

不要试图用 #undef 来解决您的问题,这只是一种冒险方式(或者,根据墨菲定律,保证)重叠宏名称的错误定义将被意外使用。

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

这可能看起来很愤世嫉俗,请理解我只是想让你从我所做的一些严肃的 scorch-mark 经历中受益。在出现不干净的重叠符号的情况下进行调试会使您感到焦躁。正如我在个人资料中提到的,我学会了迷信地认为 #undef 不吉利。

但是,要同时回答你写的实际问题,要摆脱 "redefinition" 症状(不是问题,记住)你需要在两个包含之间做 #undef,而不是前。这样第一个 include 定义了有问题的宏。然后它变得不确定。然后第二个include又定义了,没看到已经定义了。