GCC Определить тип пустоты * во время выполнения - PullRequest
0 голосов
/ 11 февраля 2011

Я работаю над универсальным контейнером, в котором данные хранятся с использованием void *, я знаю, что нет способа определить тип void * во время выполнения в C. Что мне было интересно, так это то, что это возможно сделатьиспользуя расширение gcc или любой другой трюк?Мне нужно только определить между моим типом и любым другим типом, одна моя функция должна определить, передается ли ему контейнер моего или любого другого типа, если это контейнер, делать что-то еще, ничего не делать.

Ответы [ 3 ]

4 голосов
/ 11 февраля 2011

Один из способов справиться с этим - с помощью дополнительного аргумента функции.Другой способ заключается в инкапсуляции вашего void * в структуру, которая приносит некоторые данные типа для поездки.Компилятор, скорее всего, не сможет вам здесь помочь.

2 голосов
/ 11 февраля 2011

Вы можете реализовать собственную систему RTTI, например:

typedef struct t_record {
    enum { type_A, type_B } type;
    union {
        struct {
            int foo;
            float bar;
        } A;
        struct {
            unsigned int n;
            char buf[128];
        } B;
    };
} record;

void eggs(int, float);
void salad(unsigned int n, char const * const);

void spam(record *r)
{
    if(r->type == type_A)
        eggs(r->A.foo, r->A.bar);

    if(r->type == type_B)
        salad(r->B.n, r->B.buf);
}
1 голос
/ 12 февраля 2011

Один из способов - поместить все экземпляры вашего типа данных в хеш-таблицу и выполнить поиск, чтобы убедиться, что аргумент находится в таблице. Другой способ - выделить все экземпляры вашего типа данных из смежной области памяти и проверить аргумент arg, чтобы увидеть, находится ли он в этой области - ранние интерпретаторы LISP работали именно так. В противном случае передайте флаг подпрограмме или вызовите две разные подпрограммы.

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