簡體   English   中英

c ++中的預處理器宏覆蓋函數定義

[英]Preprocessor macro overriding function definition in c++

我對C ++的基礎知識非常熟悉,但缺乏經驗(主要是Java中的代碼),所以稍微“愚蠢”的回復將不勝感激:)

我正在擴展一個更大的開源項目,該項目使用標准的visual studio class limits.h,其中可以找到以下代碼:

template<> class numeric_limits<double>
    : public _Num_float_base
    {   // limits for type double
public:
    typedef double _Ty;

    static _Ty (max)() _THROW0()
    {   // return maximum value
        return (DBL_MAX);
    }

我現在已經導入了另一個開源項目,該項目使用minwindef.h,其中包含以下代碼:

#ifndef max
#define max(a,b)            (((a) > (b)) ? (a) : (b))
#endif

現在,構建因為此行而中斷

SUMOReal distance = std::numeric_limits<SUMOReal>::max();

編譯器抱怨沒有任何參數使用max()。 有沒有快速解決此問題的方法,或者我可以簡單地不使用我導入的庫? :/

希望這很清楚,謝謝你的任何建議!!

解決問題的唯一方法是#undef宏。

這是傳統上拼寫所有UPPER_CASE字母的宏的原因之一,而系統和標准函數都是小寫的。

您可以阻止C ++預處理器擴展特定代碼行的max宏,然后在該行之后重新啟用它。 此解決方案不會影響代碼的其他部分(即,如果在其他地方需要宏max ):

#pragma push_macro("max")
#undef max
SUMOReal distance = std::numeric_limits<SUMOReal>::max();
#pragma pop_macro("max")

在編譯器設置中,定義NOMINMAX 這將阻止Windows標頭嘗試定義minmax宏。 這是處理此問題的正確方法; 試圖#undef它是不可靠和容易出錯的。 有關此標志的更多信息,請搜索NOMINMAX

你也可以在緊要關頭做到這一點,但不要養成習慣:

SUMOReal distance = (std::numeric_limits<SUMOReal>::max)();

暫無
暫無

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

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