Вы можете сделать это для определенных строк, которые вы знаете заранее, представленные макросу как символы, а не как строковые литералы, но не для общих символов, а не для строковых литералов вообще. Например:
#include <stdio.h>
#define STRINGIFY(s) # s
#define EXPAND_TO_STRING(x) STRINGIFY(x)
#define TRUNCATE_ObjectT Object
#define TRUNCATE_MrT Pity da fool
#define TRUNCATE(s) EXPAND_TO_STRING(TRUNCATE_ ## s)
int main(){
printf(TRUNCATE(ObjectT)); // prints "Object"
printf(TRUNCATE(MrT)); // prints "Pity da fool"
}
Это зависит от оператора маркеров оклейки, ##
, чтобы построить имя макроса, развернутый усеченный текст (или, на самом деле, замена текст), и оператор stringification, #
, чтобы преобразовать расширенный результат в строковый литерал. Там также требуется небольшое макроопределение, чтобы гарантировать, что все необходимые расширения будут выполнены.
напишите 'do ... while', вычислите' strlen' и напечатайте до 'strlen-2' ... но он слишком широк ... –
' #define ObjectT "Объект" ',' #define MACRO (o) o' .... –
Невозможно делать то, что вы хотите. Вы можете добавлять символы к идентификаторам, но их нельзя удалить. –