【问题标题】:Quick check to see if structure of function pointers is NULL in C99快速检查 C99 中函数指针的结构是否为 NULL
【发布时间】:2015-02-07 11:19:32
【问题描述】:

在 C99 中,除了检查每个单独的指针之外,还有更简单的方法来检查函数指针结构是否为 NULL?

我目前拥有的类似于以下内容:

typedef struct {
    void* (*foo)(int a);
    int   (*bar)(int a, int b);
} funcs;

void *funcs_dll;

funcs_dll = dlopen("my_funcs_dll.so", RTLD_GLOBAL);
if (funcs_dll == NULL) {
    THROW_ERROR;
}

funs.foo = dlsym(funcs_dll, "foo");
funcs.bar = dlsym(funcs_dll, "bar");

if (!funcs.foo || !funcs.bar) {
    THROW_ERROR;
}

我要做的是减少第二个 if 检查,这样我就不需要检查每个单独的功能。任何建议都会有所帮助。

【问题讨论】:

标签: c structure function-pointers c99


【解决方案1】:

不直接,不。

您不能使用memcmp() 与某个常量缓冲区进行比较,因为结构内部可能存在填充,该填充将具有“随机”值。如果您可以确保结构的大小恰好是函数指针字段的总和,那么您也许可以这样做。

您还可以使用代理,即声明一个初始 uint32_t 成员,该成员是一个位集,表示哪些函数指针是有效的。然后您可以并行检查多达 32 个(或使用uint64_t 时为 64 个)代理位。

如果您只想这样做一次,我的建议是数据驱动的方法。定义要查找的函数名称表,并在循环中处理它,一旦dlsym() 调用失败就退出。

类似:

const struct {
  const char *name;
  size_t     offset;
} functions[] = {
{ "foo", offsetof(funcs, foo) },
{ "bar", offsetof(funcs, bar) },
};

像这样的数据驱动代码非常强大,而且通常非常快。

【讨论】:

    【解决方案2】:

    dlsym创建包装函数,如果返回值为NULL,它将设置错误标志。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-22
      • 1970-01-01
      相关资源
      最近更新 更多