64/sqr(4)
64/4*4
करने के लिए विस्तारित किया गया है।
आप मैक्रो शरीर parenthetise करने के लिए है और यह भी रखना चाहिए कोष्टक तर्क aroud:
#define sqr(a) ((a)*(a))
पैदावार: 64/(4*4)
ध्यान दें कि मैक्रो शुद्ध कर रहे हैं शाब्दिकसी पूर्वप्रक्रमक द्वारा किया जाता प्रतिस्थापन से पहले वास्तविक संकलन शुरू होता है।
एक बेहतर और प्रकार-सुरक्षित दृष्टिकोण एक inline
समारोह का उपयोग करने के होगा:
static inline int sqr(int a)
{
return a * a;
}
यह संभावना संकलक के रूप में ज्यादा के रूप में मैक्रो होगा द्वारा कॉलर कोड में inlined हो जाएगा। ओटीओएच, कंपाइलर आंतरिक हेरिस्टिक्स के आधार पर, बहुत अच्छा फैसला नहीं कर सकता है। आम तौर पर, आपको उचित तरीके से उपयोग करने के लिए कंपाइलर पर भरोसा करना चाहिए, जब तक कि आपके पास गंभीर प्रदर्शन/कोड-आकार के मुद्दे न हों।
यह a
तर्क को दो बार मूल्यांकन करने के खिलाफ भी रक्षा करेगा। यही कारण है कि महत्वपूर्ण है, अगर वहाँ की तरह
int i[2], *p = i;
sqr(*p++);
दुष्प्रभाव मैक्रो संस्करण के लिए, इस अपरिभाषित व्यवहार (मूल्यांकन के अपरिभाषित आदेश) का परिणाम देगा कर रहे हैं:
((*p++) * (*p++))