试图修复以下“宏重新定义”警告:
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数学库,那么如何防止生成此警告呢?
发布于 2020-02-11 18:16:26
如果您真的需要使用两个带有重叠标识符名的库(我对您的感觉很差),那么唯一干净的方法就是从分离的.c文件中使用它们。
也就是说,创建一个.c文件,该文件包括一个库的头,另一个.c文件包含另一个库的头。
应以这种方式解决与宏定义重叠的问题。
如果另外有重叠的链接器标识符(函数名、全局变量名.),则需要将这两个代码文件分别链接到相应的库中。
如果你必须在你编写的一个函数中使用两个库的功能,那么真正的麻烦就开始了。这将需要首先将这两个函数封装在相应的代码文件中的唯一命名函数中,然后可以从另一个代码文件中毫不矛盾地调用这些函数来使用这两个函数。
不要试图用#undef来解决您的问题,这只是一种冒险的方法(或者,根据墨菲定律,保证)会意外地使用重叠宏名的错误定义。
简而言之,如果您认为#undef可以帮助您,那么您的问题就比您所意识到的要大。
这可能显得愤世嫉俗,请理解,我只想让你受益于一些严重的焦痕的经验,我所做的。在不干净的重叠符号存在的情况下进行调试将导致您被烧掉。正如我在我的个人资料中提到的,我学会了迷信地认为#undef是不吉利的。
但是,为了回答您所写的实际问题,要摆脱“重新定义”症状(不是问题,注意),您需要在两者之间做#undef,而不是以前。这样,第一个包含定义了有问题的宏。然后它就没有定义了。然后第二个包含再次定义它,而没有看到它已经被定义了。
https://stackoverflow.com/questions/60174589
复制相似问题