Передача типа переменной в качестве параметра функции - PullRequest
23 голосов
/ 12 июля 2011

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

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

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

Ответы [ 4 ]

32 голосов
/ 12 июля 2011

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

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;
         ...
    }
}
13 голосов
/ 12 июля 2011

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

#define foo(type_t) ({ \
    unsigned char bar; \
    bar = ((type_t*)(&static_array))->member; \
    ... \
    })
7 голосов
/ 17 сентября 2016

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

#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;
}
3 голосов
/ 12 июля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...