Проверьте переменную typeof с помощью typeof в C - PullRequest
0 голосов
/ 30 марта 2020

У меня есть переменная, которую я не тип. Таким образом, чтобы напечатать, что я не знаю, использовать ли %d или %f. Для этого я хочу проверить его тип перед печатью.

Теперь, чтобы проверить его тип, я хочу использовать его так:

if (typeof(int) == voltage) {
snprintf(chars, sizeof(chars), "%d", voltage);
}

Теперь это недопустимо.

Мне нужен способ проверки типа переменной.

Я тестирую с двумя переменными, но я думаю, что следующее также недопустимо.

И как использовать эту функцию getIntType / (Как она называется? Macro?), Которую я получил и изменил из здесь и здесь ?

#define getIntType(a,b)  ({ __auto_type _a = (a); __auto_type _b = (b); _a == typeof(int) ? _a : _b; });

        int a = 10;
        double b = 20.0;
    int x = getIntType(a,b)==?; //How to call and how to store in type var of this x?

и как вернуть значение из макроса / как это использовать?

        #define typecheck(type,x) \
        ({  type __dummy; \
        typeof(x) __dummy2; \
        (bool)(&__dummy == &__dummy2); \
        }) // How to return value to check?


    //Then how to check?
        int a = 10;
        double b = 20.0;
       //int x = getIntType(a,b)? a : b;

        //bool isInt = typecheck(typeof(int), a);

1 Ответ

1 голос
/ 30 марта 2020

Если вам нужно решение portable , вы можете посмотреть макросы C11 generi c, эквивалентные бедному C программисту полиморфизму C ++: -)

Следующая программа показывает как вы можете его использовать:

#include <stdio.h>

#define Output(buff, sz, T) _Generic((T), \
    char *: OutputS, \
    double: OutputD, \
    int: OutputI \
)(buff, sz, T)
void OutputS(char *buff, size_t sz, char *s)  { snprintf(buff, sz, "S %s", s); }
void OutputD(char *buff, size_t sz, double d) { snprintf(buff, sz, "D %f", d); }
void OutputI(char *buff, size_t sz, int i)    { snprintf(buff, sz, "I %d", i); }

int main() {
    char buff[100];
    Output(buff, sizeof(buff), "hello"); puts(buff);
    Output(buff, sizeof(buff), 5);       puts(buff);
    Output(buff, sizeof(buff), 3.14159); puts(buff);
}

Вы видите, что правильная функция вызывается в зависимости от типа данных:

S hello
I 5
D 3.141590
...