«Правильное» решение - это то, что вы называете тривиальным. Все эти умные макросы (я бы сам использовал m4) просто сделают ваш код менее управляемым, чем если бы вы просто оставили его как константу.
Проблема, с которой вы здесь столкнулись, состоит в том, что строки не являются структурой данных первого класса в C. Они представляют собой массив байтов. Для этого вам нужно создать массив, который вы хотите получить желаемое значение, и вы создаете этот массив с помощью sprintf. Это не красиво, но это правильно.
Если у вас есть проблемы с производительностью, и вы нашли их здесь, тогда да, исключите вызовы функций. Но если значение для MACRO_SIZE не будет повторяться сто раз или распределяться по нескольким файлам, я бы просто изменил литерал. Макрос - это просто фальшивка с большей гибкостью, использование sprintf на самом деле дает вам гибкость.