2015-05-25 2 views
17

Есть ли способ, чтобы преобразовать 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; 
} 

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

+1

Вы можете попробовать использовать тип-общий макрос? –

+1

Зачем вы хотите это сделать? –

ответ

17

С 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) 

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

В C++ есть также typeid ключевое слово:

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

Это именно то, что я искал! – user2868331

+0

'_Generic' имеет некоторые двусмысленности в отношении селекторов типов. См. Ссылки в моем ответе, прежде чем полагаться на квалифицированные типы. – Olaf

5

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

Итак, ответ: не для pre-C11. Для C11 см. Ответ @tmlen, но имейте в виду, что существуют некоторые двусмысленности в отношении селекторов типа _Generic, которые по-разному решаются в разных компиляторах, что может привести к проблемам с квалифицированными типами. Существует отчет об дефекте по этой проблеме, прочтите фрагмент Дженса Густедта для получения дополнительной информации: 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).

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