GCC 在运行时确定 void* 的类型

发布于 2024-10-16 18:39:59 字数 163 浏览 1 评论 0原文

我正在开发一个通用容器,其中使用 void* 保存数据,我知道在 C 中无法在运行时确定 void* 的类型。我想知道是否可以使用 gcc 来做到这一点扩展或任何其他技巧?我只需要确定我的类型和任何其他类型,我的一个函数需要确定它是否传递给我的容器或任何其他类型,如果它是一个容器,则执行其他操作不执行任何操作。

I am working on a generic container where data is held using a void*, I know that there is no way to determine the type of void* at runtime in C. What I was wondering is that is it possible to do it using a gcc extension or any other trick? I only need to determine between my type and any other type, one function of mine needs to determine if it is passed a container of mine or any other type if it is a container do something else do nothing.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

反目相谮 2024-10-23 18:39:59

处理此问题的一种方法是向函数添加一个附加参数。另一种方法是将您的 void * 封装在一个结构中,该结构会带来一些类型数据。编译器很可能无法在这里为您提供帮助。

One way to handle this is with an additional argument to the function. Another is to encapsulate your void * in a struct that brings some type data along for the ride. The compiler most likely won't be able to help you here.

烟酒忠诚 2024-10-23 18:39:59

您可以实现自定义 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);
}

You could implement a custom RTTI system, like:

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);
}
又怨 2024-10-23 18:39:59

一种方法是将数据类型的所有实例放入哈希表中,然后查找 arg 是否在表中。另一种方法是从连续的内存区域分配数据类型的所有实例,并检查 arg 以查看它是否在该区域中——早期的 LISP 解释器就是这样工作的。否则,将标志传递给例程,或调用两个不同的例程。

One way is to put all instances of your data type in a hash table and do a lookup to see if the arg is in the table. Another way is to allocate all instances of your data type from a contiguous area of memory and check the arg to see if it's in that area -- early LISP interpreters worked that way. Otherwise, pass a flag to the routine, or call two different routines.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文