簡體   English   中英

#undef 似乎對宏重新定義沒有影響(警告 C4005)

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

嘗試修復以下“宏重新定義”警告:

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 數學庫,如何防止生成此警告?

如果你真的必須使用兩個具有重疊標識符名稱的庫(可憐你,我覺得你)那么唯一干凈的方法是從單獨的 .c 文件中使用它們。
即制作一個 .c 文件,其中包括一個 lib 的頭文件和第二個 .c 文件,其中包括另一個 lib 的頭文件。
重疊宏定義的問題應該以這種方式解決。

如果您另外有重疊的鏈接器標識符(函數名、全局變量名...),則需要將兩個代碼文件分別鏈接到相應的庫。

如果您必須在您編寫的一個函數中使用來自兩個庫的功能,那么真正的麻煩就開始了。 這將需要首先將這兩個功能包裝在相應代碼文件中唯一命名的函數中,然后可以從另一個代碼文件中明確調用以使用兩者。

不要試圖用#undef解決你的問題,這只是一種冒險(或者,根據墨菲定律,保證)重疊宏名稱的錯誤定義將被意外使用的方法。

簡而言之,如果您認為#undef可以幫助您,那么您的問題比您意識到的要大。

這可能看起來很憤世嫉俗,請理解我只是想讓你從我做的一些嚴重的焦痕經歷中受益。 在存在不干凈重疊符號的情況下進行調試會讓您感到惱火。 正如我在我的個人資料中提到的,我學會了迷信地認為#undef是不走運的。

但是,要回答您寫的實際問題,要擺脫“重新定義”症狀(不是問題,請注意),您需要在兩個包含的內容之間執行#undef ,而不是之前。 這樣第一個包含定義了有問題的宏。 然后它變得未定義。 然后第二個包含再次定義它,沒有看到它已經被定義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM