ماکروهائی که مشابه تابع مقداری را محاسبه و برمی گردانند 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;}