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