2016-05-20 2 views
5

Можно ли определить макрос, который будет обрезать часть переданного аргумента строки?Может ли макрос удалять символы из своих аргументов?

Например:

//can this be defined? 
#define MACRO(o) ??? 

int main(){ 
    printf(MACRO(ObjectT)); //prints "Object" not "ObjectT" 
} 

было бы возможно для макроса, обрежьте последний символ «T»?

+0

напишите 'do ... while', вычислите' strlen' и напечатайте до 'strlen-2' ... но он слишком широк ... –

+1

' #define ObjectT "Объект" ',' #define MACRO (o) o' .... –

+3

Невозможно делать то, что вы хотите. Вы можете добавлять символы к идентификаторам, но их нельзя удалить. –

ответ

4

Вы можете сделать это для определенных строк, которые вы знаете заранее, представленные макросу как символы, а не как строковые литералы, но не для общих символов, а не для строковых литералов вообще. Например:

#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, # , чтобы преобразовать расширенный результат в строковый литерал. Там также требуется небольшое макроопределение, чтобы гарантировать, что все необходимые расширения будут выполнены.

-2

С препроцессором? Нет, это звучит как то, что вы действительно хотите сделать что-то вроде этого:

код не тестировался

#define STRINGIFY(o) #o 

char* serialize(char* s) 
{ 
    if (strcmp(s, "ObjectT") == 0) return "Object"; 
} 

int main(){ 
    printf(serialize(STRINGIFY(#o))); //prints "Object" not "ObjectT" 
} 
+0

Downvoter объясняет? – user6362627

+0

Если вы делаете это так, что мешает вашей «сериализации» просто отрубить персонажа? –

+0

@EugeneSh. Конечно, сделайте это, если хотите, но я делаю обоснованное предположение о фактической проблеме OP. Это действительно оправдывает ниспровержение? – user6362627

-1

Ну, по крайней мере, он должен печати «Объект» ...

//can this be defined? 
#define MACRO(o) #o "\b \b" 

int main(){ 
    printf(MACRO(ObjectT)); //prints "Object" not "ObjectT" 
} 

И нет, вы не можете лишить символ с помощью препроцессора только без фактического кода C (скажем, malloc + strncpy), чтобы сделать это.

Смежные вопросы