Почему я получаю формат printf для определенного базового типа данных в макросе? - PullRequest
2 голосов
/ 16 октября 2011

Как написать FORMAT_OF(type), чтобы оно было %d для int, %s для char * и т. Д.

Есть ли макрос для получения формата для основных данныхтипы?

Ответы [ 4 ]

5 голосов
/ 16 октября 2011

Да. Но это доступно только в C11.

#define FORMAT_OF(x) _Generic((x), \
    int: "%d", \
    unsigned: "%u", \
    const char *: "%s", \
    void *: "%p")

Для типов вместо значений вы можете попробовать _Generic((type) 0, ....

Ваш компилятор, вероятно, не поддерживает C11. В GCC 4.6 (но не в 4.5!) Включена поддержка C11 с -std=c1x или -std=gnu1x, но я не думаю, что _Generic пока поддерживается.

1 голос
/ 16 октября 2011

Нет. В настоящее время стандартизированные версии C не поддерживают самоанализ типов этого типа.

0 голосов
/ 16 октября 2011

Ну, если вы хотите, чтобы макрос принимал тип, вы можете:

#define FORMAT_int "%d"
#define FORMAT_char "%c"
...
#define FORMAT(x) FORMAT_##x

и использовать FORMAT(int) позже; но

int i;
FORMAT(i);

будет не работать, и FORMAT(char*) также не будет работать.

0 голосов
/ 16 октября 2011

В C нет встроенных макросов, но вы могли бы легко написать функцию-обертку для достижения этой цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...