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

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

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

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

Я помню, что он имеет какое-то отношение к GCC typeof и использует макросы?

4b9b3361

Ответ 1

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

#define foo(type_t) ({ \
    unsigned char bar; \
    bar = ((type_t*)(&static_array))->member; \
    ... \
    })

Ответ 2

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

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;
         ...
    }
}

Ответ 3

Не функция, но вы можете использовать такой макрос:

#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); // <-- action happens here
  printf("a=%d, b=%d \n", a, b); // a=0, b=3

  return 0;
}

Ответ 4

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

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