از دیگر کاربردهای اساسی پیش پردازنده ها ماکروها هستند.
همانطور که گفته شد با راهنمای define# یک شناسه را می توان به یک ثابت نسبت داد تا یک ثابت سمبلیک شکل بگیرد. از راهنمای define# برای مربوط کردن شناسه های معنی دار به عباراتی که زیاد استفاده می شوند هم بکار می رود. وقتی یک شناسه به یک عبارت یا جمله ربط داده می شود ماکرو (macro) نامیده می شود.
شکل کلی تعریف ماکرو به صورت زیر است:
[define MACRO_NAME(arg1, arg2, …) [code to expand to#
arg1، arg2 و … آرگومان های ماکرو هستند که تعداد آنها اختیاری است.
وقتی پیش پردازنده با نام ماکرو در برنامه مواجه می شود آن را یک فراخوانی به ماکرو تلقی می کند و یک کپی از بدنه ماکرو را جایگزین نام ماکرو می کند. اگر ماکرو دارای پارامترهائی باشد، آرگومان هائی که بدنبال نام ماکرو قرار دارند جایگزین آن ها در بدنه ماکرو می شوند.
در عمل دو نوع ماکرو وجود دارد: شیء گونه که پارامتری ندارد و تابع گونه که می تواند آرگومان هائی را بپذیرد و بسیار شبیه فراخوانی تابع می ماند.
یک ماکرو را می توان دوباره با همان مقدار قبلی تعریف کرد ولی تعریف مجدد ماکرو با مقدار جدید ممکن نیست. مگر اینکه تعریف قبلی را حذف کنید. راهنمای undef# برای حذف تعریف یک ماکرو است.
چون ماکرو سربار فراخوانی تابع را ندارد سریع تر از تابع عمل می کند. اما بخاطر داشته باشید فراخوانی ماکرو تنها یک جایگزینی عبارت است و کامپایلر آن را بلافاصله تفسیر نمی کند بنابراین کاری در ارتباط با الویت عملگرها، سازگاری نوع، قواعد انتساب یا ارجاع و موارد دیگر ندارد. در نتیجه مخاطراتی را بدنبال خواهد داشت که به برخی از آنها در ادامه اشاره می شود. بنابراین بهتر است با احتیاط تعریف شود یا اصلا استفاده نشود.