На чистом C скорей нельзя: если строку можно, потенциально,
разобрать на constexpr буковки через "STR"[1], "STR"[2]..., то
длину строки на уровне макропроцессора -- не выявить. На C++ можно
сделать, начиная с C++11. Подходы могут быть немного разные: 1) в C++11 есть ряд проблем: нет user defined literals (способных элементарно разбит строку по дискретным буковкам видимым в пространстве типов) и std::array, std::initializer_list имеют не-constexpr аксессоры (не написать рекурсивную функцию, которая строит std::array из первой буковки и нуля, а далее выливает воду из чайника). Вопрос со склейкой результата по-видимости толком не решается, я не придумал как, но можно, если разбили по буковкам, рекурсивно передать в variadic шаблон прямо вместе с нулями и на финальной итерации вернуть std::array нужного размера. Как-то так:
Coliru Viewer
2) в C++14 и старше, как сказано выше и на буковки побить легко, и промежуточные результаты (std::array) можно друг друго инициализировать и следовательно легко написать рекурсивную функцию.