मैक्रो (प्रभावी रूप से) अधिक कुशल है, क्योंकि इसमें फ़ंक्शन कॉल शामिल नहीं है। इसे और अधिक आसानी से अनुकूलित किया जा सकता है, क्योंकि इसमें केवल एक संकेतक ऑफ़सेट लुकअप शामिल है।
फ़ंक्शन कॉल एक ही लाइब्रेरी के खिलाफ लिंक करने की अनुमति देता है, भले ही प्रोग्राम को मैक्रो परिभाषा के बिना संकलित किया गया हो - यदि यह एक अलग हेडर के साथ संकलित किया गया था, या सिर्फ स्रोत फ़ाइल के अंदर एक दुष्ट घोषणा के साथ। उदाहरण के लिए, आपके पास एक कंपाइलर होना चाहिए, जिसमें किसी का "बेहतर" संस्करण ctype.h हो , जिसमें मैक्रो न हो, फ़ंक्शन अभी भी उपयोग के लिए रनटाइम पर मौजूद होगा।
यदि हम मानक को देखें:
c99
7.1.4 पुस्तकालय कार्यों का उपयोग
हेडर में घोषित कोई भी फ़ंक्शन, हेडर में फ़ंक्शन-जैसे मैक्रो डे the ned के रूप में अतिरिक्त रूप से कार्यान्वित किया जा सकता है, इसलिए यदि किसी लाइब्रेरी फ़ंक्शन को स्पष्ट रूप से घोषित किया जाता है जब उसके हेडर को शामिल किया जाता है, तो नीचे दी गई तकनीकों में से एक का उपयोग घोषणा को सुनिश्चित करने के लिए नहीं किया जा सकता है। इस तरह के मैक्रो से प्रभावित। किसी फ़ंक्शन के किसी भी मैक्रो डे of नेस्ट को कोष्ठक में फ़ंक्शन के नाम को संलग्न करके स्थानीय रूप से दबाया जा सकता है, क्योंकि नाम तब बाईं कोष्ठक द्वारा पीछा नहीं किया जाता है जो मैक्रो फ़ंक्शन नाम के विस्तार को इंगित करता है। एक ही वाक्यविन्यास कारण के लिए, यह एक पुस्तकालय समारोह का पता लेने की अनुमति दी जाती है, भले ही वह मैक्रो के रूप में भी macro ned हो।
इसका मतलब है कि यदि आप लिखते हैं:
int b = (isdigit)(c);
या
int (*f)(int) = &isdigit;
int b = f(c);
तब आप वास्तविक कार्य को लागू कर रहे हैं, मैक्रो को नहीं। आप कानूनी रूप से भी लिख सकते हैं:
#undef isdigit
int b = isdigit(c);
या (स्रोत फ़ाइल में #include <ctype.h>
सीधे या ट्रांसीवरली नहीं):
extern int isdigit(int);
int b = isdigit(c);