ম্যাক্রো (পুটিকটি) আরও দক্ষ, কারণ এতে কোনও ফাংশন কল জড়িত না। এটি আরও সহজেই অনুকূলিত করা যায়, কারণ এটিতে কেবলমাত্র একটি পয়েন্টার অফসেট অনুসন্ধান অন্তর্ভুক্ত থাকে।
ফাংশন কলটি একই লাইব্রেরির সাথে সংযোগ স্থাপনের অনুমতি দেয় এমনকি ম্যাক্রো সংজ্ঞা ব্যতীত প্রোগ্রামটি সংকলন করা হয় - যদি এটি একটি ভিন্ন শিরোনামের সাথে সংকলিত করা হয়, বা উত্স ফাইলের ভিতরে একটি দুর্বৃত্ত ঘোষণার সাহায্যে। উদাহরণস্বরূপ, আপনার কাছে এমন একটি সংকলক থাকা উচিত যাতে কারওর সিটিপিএইচ। র "উন্নত" সংস্করণ রয়েছে করা হয়নি ম্যাক্রো আছে, ফাংশন এখনও ব্যবহারের জন্য রানটাইম অস্তিত্ব হবে।
যদি আমরা স্ট্যান্ডার্ডটি দেখি:
C99
.1.১.৪ গ্রন্থাগারের কার্যাদি ব্যবহার
শিরোনামে ঘোষিত যে কোনও ফাংশন অতিরিক্তভাবে ফাংশন-জাতীয় ম্যাক্রো ডি-এনড হিসাবে শিরোলেখ হিসাবে প্রয়োগ করা যেতে পারে, সুতরাং যদি কোনও লাইব্রেরির ফাংশন যদি তার শিরোলেখ অন্তর্ভুক্ত থাকে তখন স্পষ্টভাবে ঘোষণা করা হয়, ঘোষণাটি নিশ্চিত করার জন্য নীচে প্রদর্শিত কৌশলগুলির মধ্যে একটি ব্যবহার করা যেতে পারে যেমন একটি ম্যাক্রো দ্বারা প্রভাবিত। কোনও ফাংশনটির যেকোন ম্যাক্রো ডিফিনেশন স্থানীয়ভাবে ফাংশনটির নাম বন্ধনীতে সংযুক্ত করে দমন করা যেতে পারে, কারণ নামটি পরে বাম বন্ধনী দ্বারা অনুসরণ করা হয় না যা ম্যাক্রো ফাংশন নামের প্রসারকে নির্দেশ করে। একই সিনট্যাকটিক কারণে, এটি কোনও ম্যাক্রো হিসাবে স্বীকৃত হলেও লাইব্রেরির ফাংশনটির ঠিকানা নেওয়ার অনুমতি রয়েছে।
এর অর্থ হ'ল আপনি যদি লিখেন:
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);