क्लासिक उदाहरण दो मूल्य की गणना करने के लिए अधिकतम एक मैक्रो है:
#define MAX(a, b) ((a) > (b) ? (a) : (b))
अब की सुविधा देता है "कहते हैं" इस तरह मैक्रो:
int x = 5;
int y = 7;
int z = MAX(x++, y++);
अब अगर MAX
एक सामान्य कार्य था, हम उम्मीद करेंगे कि x
और y
एक बार बढ़ेगा, है ना? हालांकि, क्योंकि यह एक मैक्रो "कहते हैं" इस तरह बदल दिया जाता है है:
int z = ((x++) > (y++) ? (x++) : (y++));
जैसा कि आप देख, चर y
दो बार वृद्धि की जाएगी, हालत में एक बार और एक बार ternary operator के अंत-परिणाम के रूप में।
यह दुष्प्रभाव (बाद में वृद्धि अभिव्यक्ति) और एक मैक्रो विस्तार के साथ एक अभिव्यक्ति का परिणाम है।
संबंधित नोट पर, मैक्रोज़ के साथ अन्य खतरे भी हैं। उदाहरण के लिए, इस सरल मैक्रो को लें:
#define MUL_BY_TWO(x) (x * 2)
सरल सही लगता है? लेकिन अब क्या होगा अगर हम इसे इस तरह का उपयोग करें:
int result = MUL_BY_TWO(a + b);
int result = (a + b * 2);
तरह का विस्तार होगा कि और जैसा कि आप उम्मीद है कि गुणा जानता है, इसके अलावा अधिक से अधिक पूर्वता है तो अभिव्यक्ति a + b * 2
a + (b * 2)
के बराबर है, शायद मैक्रो लेखक द्वारा क्या इरादा नहीं था। यही कारण है कि मैक्रो में किए गए तर्कों को अपने स्वयं के कोष्ठकों के अंदर रखा जाना चाहिए है:
#define MUL_BY_TWO(x) ((x) * 2)
फिर विस्तार
int result = ((a + b) * 2);
जो शायद सही है किया जाएगा।
http://stackoverflow.com/questions/7299286/whats-the-side-effect-of-the-following-macro-in-c-embedded-c एक अच्छा उदाहरण है। – Downvoter