【问题标题】:#undef seems to have no effect on macro redefinitions (warning C4005)#undef 似乎对宏重新定义没有影响(警告 C4005)
【发布时间】:2020-05-27 04:46:52
【问题描述】:

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

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

【问题讨论】:

    标签: visual-c++ macros c-preprocessor redefinition undef


    【解决方案1】:

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

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

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

    不要试图用#undef 来解决你的问题,那只是冒着风险(或者,根据墨菲定律,保证)重叠宏名称的错误定义会被意外使用的风险。

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-12-31
      • 2016-03-28
      • 1970-01-01
      • 1970-01-01
      • 2015-10-31
      • 2019-02-16
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      相关资源
      最近更新 更多