غريبة C++ الأخطاء البرمجية التي قد min()/ماكس() المكالمات

StackOverflow https://stackoverflow.com/questions/14165

  •  08-06-2019
  •  | 
  •  

سؤال

أنا أرى أخطاء غريبة عندما بلدي C++ رمز مين() أو أقصى() المكالمات.أنا باستخدام Visual C++ compilers.

هل كانت مفيدة؟

المحلول

تحقق إذا كانت التعليمات البرمجية الخاصة بك بما في ذلك يقوم نظام ويندوز.ح ملف الرأس و إما التعليمات البرمجية الخاصة بك أو غيرها من طرف ثالث رؤوس بهم مين()/ماكس() التعاريف.إذا كان الجواب نعم, ثم prepend الخاص بك يقوم نظام ويندوز.ح إدراج مع تعريف NOMINMAX مثل هذا:

#define NOMINMAX
#include <windows.h>

نصائح أخرى

احتمال آخر يمكن أن يكون من الآثار الجانبية.معظم مين/ماكس وحدات الماكرو سوف تشمل المعلمات عدة مرات و قد لا تفعل ما كنت تتوقع.الأخطاء والتحذيرات ويمكن أيضا أن تتولد.

max(a,i++) expands as ((a) > (i++) ? (a) : (i++))

بعد ذلك أنا هو إما زائد 1 أو + 2

(في) في التوسع لتجنب المشاكل إذا كنت الاتصال مع الصيغ.محاولة توسيع max(a,b+c)

منذ ويندوز يعرف هذا كما دالة على غرار الماكرو الحلول التالية متوفرة:

int i = std::min<int>(3,5);

يعمل هذا لأن الماكرو min() يتم توسيع إلا عندما min تليها (, وليس عندما يتبعه <.

آآخ...نطاق ذلك يا صاح: std::min(), std::max().

أنا لم تستخدم في سنة ولكن من الذاكرة دفعة يعين min و max جدا, ربما ؟

بصراحة عندما يتعلق الأمر مين/ماكس, أجد أنه من الأفضل أن مجرد تعريف:

#define min(a,b) ((a) < (b) ? (a) : (b))
#define max(a,b) ((a) >= (b) ? (a) : (b))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top