Подтвердить что ты не робот

Преобразование typeof в строку

Есть ли способ преобразовать расширение gcc typeof в строку, например:

#define printType(a) printf("%s", #typeof(a))

Так что я могу сделать:

int a = 4;
printf("Type of a is: ");
printType(a);

И получите вывод:

Type of a is: int

Возможное использование этого будет следующим:

#include <stdio.h>

#define indirect_print(a) print_##typeof(a)(a)

void print_int(int *i) {
    printf("%d", *i);
}

void print_char(char *c) {
    printf("%c", *c);
}

int main(void) {
    char C = 'C';
    int I = 100;

    {
        char *a = &C;
        indirect_print(a);
    }

    {
        int *a = &I;
        indirect_print(a);
    }

    return 0;
}

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

4b9b3361

Ответ 1

Так как C11, вы можете использовать общий, см. http://en.cppreference.com/w/c/language/generic. Например:

#define printType(a) printf("%s", _Generic( (a) , \
                                  int : "int", \
                                  long : "long", \
                                  float : "float", \
                                  default : "other type"))(a)

Каждый тип, который можно использовать, должен быть указан.

В С++ существует также ключевое слово typeid:

#include <typeinfo>
#define printType(a) std::cout << typeid(a).name() << std::endl;

Ответ 2

Процессор pre запускается перед компилятором. Поэтому все его замены выполняются до начала фактической компиляции. typeof() оценивается компилятором, который будет видеть только строку "typeof()", которая, очевидно, не будет оценена.

Итак, ответ: не для pre-C11. Для C11 см. Ответ @tmlen, но имейте в виду, что существуют некоторые двусмысленности в отношении селекторов типов _Generic, которые по-разному решаются в разных компиляторах, что может привести к проблемам с квалифицированными типами. Существует отчет о дефекте по этой проблеме, прочтите подробное описание блога Jens Gustedt: https://gustedt.wordpress.com/2015/05/11/the-controlling-expression-of-_generic/#more-2256 (он также отправил отчет о дефекте http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_423.htm).