Передача типа переменной в качестве параметра функции

21

Возможно ли передать тип переменной как часть параметра функции, например:

void foo(varType type)
{
  // Cast to global static
  unsigned char bar;
  bar = ((type *)(&static_array))->member;
}

Я помню, что это связано с typeof GCC и использованием макросов?

    
задан freonix 12.07.2011 в 03:29
источник
  • Не в стандарте C. Возможно, в GCC, если вам (un) повезло. –  Jonathan Leffler 12.07.2011 в 03:31

4 ответа

13

Вы не можете сделать это для функции, потому что тогда ему нужно знать типы аргументов (и любые другие символы, используемые функцией) для генерации рабочего машинного кода. Вы можете попробовать макрос, например:

#define foo(type_t) ({ \
    unsigned char bar; \
    bar = ((type_t*)(&static_array))->member; \
    ... \
    })
    
ответ дан David X 12.07.2011 в 03:55
источник
29

Вы можете сделать перечисление для всех возможных типов и использовать переключатель для разыменования:

typedef enum {
    CHAR,
    INT,
    FLOAT,
    DOUBLE
} TYPE;

void foo(TYPE t, void* x){
    switch(t){
        case CHAR:
            (char*)x;
            break;
        case INT:
            (int*)x;
            break;
         ...
    }
}
    
ответ дан hugomg 12.07.2011 в 03:52
источник
  • Привет, hugomg, извините, но я не понимаю альтернативы. Не могли бы вы немного разобраться? Благодаря :-) –  leaf 19.03.2016 в 11:30
  • Я только понял, что альтернатива не работает так, как написано ... поэтому я удалил ее. Но основная идея, которую я изначально делал, заключалась в том, чтобы кодировать вещи в стиле «объектно-ориентированный» и использовать полиморфизм подтипов, чтобы делать ветвление вместо оператора switch. –  hugomg 19.03.2016 в 14:04
  • Хорошо. Благодаря :-) –  leaf 19.03.2016 в 14:28
  • для меня это работает только с typedef: "typedef enum {CHAR, INT, FLOAT, DOUBLE} TYPE;" –  ChaosPredictor 12.05.2017 в 20:50
5

Eh, , конечно вы можете . Просто используйте макрос так:

#include <stdio.h>
#define swap(type, foo, bar) ({type tmp; tmp=foo; foo=bar; bar=tmp;})

int main() {
  int a=3, b=0;
  printf("a=%d, b=%d \n", a, b); // a=3, b=0

  swap(int, a, b); // <-- WOOT, check it out!

  printf("a=%d, b=%d \n", a, b); // a=0, b=3
  return 0;
}
    
ответ дан FloatingRock 17.09.2016 в 09:43
источник
3

Я не вижу, как вы могли бы сделать это в общем случае, учитывая, что C является статически типизированным языком .

Компилятор должен знать во время компиляции, что такое тип type * , чтобы иметь возможность генерировать ссылку на ->member .

    
ответ дан David Gelhar 12.07.2011 в 03:52
источник
  • Dont быть настолько отрицательным иметь больше может сделать отношение;) –  Ray Garner 17.01.2017 в 07:43