2015-09-08 2 views
2

Я пытаюсь создать вывод в виде двойного кавычек. Например, если аргумент, который передается в str(), имеет значение , имя, тогда выход должен быть «имя», что не происходит в нижнем коде.Использование макросов в C

#include<stdio.h> 
#include<string.h> 
#define str(s) #s 
#define newline printf("\n") 

int main() 

{ 

    printf("Your double quoted code is : %s ",str(GHOST)); 
    newline; 
} 

Выход: GHOST

+1

Это почти самый унидиотический код C, который я когда-либо видел. (Исключая обфускацию/кодекс-гольф-конкурсы) – ace

+0

Пожалуйста, не пишите код так. Я предлагаю против использования макроопределений, пока вы не поймете сам язык. Просто совет. – Qix

ответ

8

То, что происходит в том, что котировки являются быть добавлены, но они потребляются как часть синтаксис языка. Потому что вам нужно передать строку , как "GHOST", до printf, а не только идентификатор.

Если вы хотите кавычки появляться при запуске программы, я хотел бы сделать это

printf("Your double quoted code is : \"%s\" ",str(GHOST)); 

вместо этого. Выведенные кавычки в строке формата появятся на выходе.

5

Вы должны изменить формат \"%s\"

2

Это должно сделать трюк.

printf("Your double quoted code is : \"%s\"",str(GHOST)); 
1

Вы можете применить stringify оператора к строке:

#define xstr(x) #x 
#define str(x) xstr(x) 
#define quote(x) str(str(x)) 

int main() { 
    printf("Your double quoted code is : %s ",quote(GHOST)); 
    putchar('\n'); 
    return 0; 
} 

Однако побочный эффект использования xstr пересканировать аргумент str - который необходим для внутреннего str(GHOST) быть расширен заключается в том, что если GHOST сам является макроопределением, он будет расширен, в отличие от GHOST в фрагменте кода в вопросе.

1

Если вы хотите, двойные кавычки в вашем выводе, то либо изменить формат строки для

printf("Your double quoted code is : \"%s\" ",str(GHOST)); 

или изменить макрос

#define str(s) "\"" #s "\"" 

Я бы посоветовал не использовать макросы в этом но вы задали вопрос.