ماکروهائی که مشابه تابع مقداری را محاسبه و برمی گردانند expression macro نامیده می شوند. و ماکرو می تواند به جای اینکه مقداری را محاسبه کند دارای چند دستور باشد که آنها را action macro می نامند.
بهتر است بدنه ماکروهای چنددستوری را درون علائم {} محصور کنید تا از بروز مشکل جلوگیری کنید.
مثال. وقتی ماکرو فراخوانی شود تنها اولین دستور آن a^=b; درون شرط قرار می گیرد و دو دستور دیگر همواره اجرا خواهند شد.
;define SWAP(a, b) a ^= b; b ^= a; a ^= b#
;int x = 10
;int y = 5
SWAP(x, y); // works OK
?What happens now//
(if(x < 0
;(SWAP(x, y
بهتر است ماکرو فوق به صورت زیر تعریف شود:
#define SWAP(a, b) do { a ^= b; b ^= a; a ^= b; } while ( 0 )
نکته. قرار دادن کل بدنه ماکرو درون پرانتز زمانی که ماکرو مقداری را برنمی گرداند الزامی نیست.
نکته. در ++C از ماکروها تا حد ممکن استفاده نمی شود چون در اکثر موارد نیازی به آنها دیده نمی شود. بیشتر از عبارت const برای تعریف ثابت و توابع درون خطی به ماکروها ترجیح داده می شوند زیرا مشکلات ماکروها را ندارند.
مثال. تابع درون خطی محاسبه مربع عدد.
void SquareOf(int x) {return x*x;}