![](/img/trans.png)
[英]C++ preprocessor/macro to automatically add lines after function definition
[英]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標頭嘗試定義min
和max
宏。 這是處理此問題的正確方法; 試圖#undef
它是不可靠和容易出錯的。 有關此標志的更多信息,請搜索NOMINMAX
。
你也可以在緊要關頭做到這一點,但不要養成習慣:
SUMOReal distance = (std::numeric_limits<SUMOReal>::max)();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.