แมโครมีประสิทธิภาพมากขึ้น (สมมุติ) เนื่องจากไม่เกี่ยวข้องกับการเรียกใช้ฟังก์ชัน สามารถปรับให้เหมาะสมได้ง่ายขึ้นเนื่องจากเกี่ยวข้องกับการค้นหาออฟเซ็ตของตัวชี้
การเรียกใช้ฟังก์ชั่นอนุญาตให้เชื่อมโยงกับไลบรารีเดียวกันแม้ว่าโปรแกรมนั้นจะถูกคอมไพล์โดยไม่มีนิยามแมโคร - ถ้ามันถูกคอมไพล์ด้วยส่วนหัวที่ต่างกันหรือเพียงแค่มีการประกาศอันธพาลภายในไฟล์ต้นฉบับ ตัวอย่างเช่นหากคุณมีคอมไพเลอร์ซึ่งมี ctype.h รุ่น "ปรับปรุง" ของใครบางคนที่ไม่มีมาโครฟังก์ชันจะยังคงมีอยู่เมื่อใช้งานจริง
ถ้าเราดูมาตรฐาน:
c99
7.1.4 การใช้ฟังก์ชั่นห้องสมุด
ฟังก์ชั่นใด ๆ ที่ประกาศในส่วนหัวอาจถูกนำมาใช้เพิ่มเติมเป็นมาโครฟังก์ชั่นที่คล้ายกันในส่วนหัวดังนั้นหากฟังก์ชั่นห้องสมุดถูกประกาศอย่างชัดเจนเมื่อรวมส่วนหัวของมันไว้หนึ่งในเทคนิคที่แสดงด้านล่างนี้ รับผลกระทบจากแมโครดังกล่าว ฟังก์ชันแมโครใด ๆ สามารถยับยั้งภายในได้โดยใส่ชื่อของฟังก์ชันไว้ในวงเล็บเพราะชื่อนั้นจะไม่ตามด้วยวงเล็บซ้ายที่ระบุการขยายตัวของชื่อฟังก์ชันแมโคร ด้วยเหตุผลทางไวยากรณ์เดียวกันมันได้รับอนุญาตให้ใช้ที่อยู่ของฟังก์ชั่นห้องสมุดแม้ว่ามันจะถูกกำหนดเป็นแมโคร
นั่นหมายความว่าถ้าคุณเขียน:
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);