【问题标题】:Is it possible to call a function (from a function pointer) with dynamic signature?是否可以使用动态签名调用函数(从函数指针)?
【发布时间】:2021-08-26 10:19:01
【问题描述】:

在 C 中,从 What is guaranteed about the size of a function pointer? 开始,似乎可以使用泛型泛型函数指针。

假设您将函数签名与指针一起存储(以某种方式......例如:每个参数的大小),是否可以动态调用此函数? (签名仅在运行时已知)。 所有函数的返回类型都是void,只有参数列表发生变化

我想知道转换为可变参数函数是否可以解决问题?

(奖励)问题是针对 C 的,但在 C++ 中,是否可以使用类似的技术,并将其应用于实例方法?

(我并不期望一定是符合标准的解决方案,但仍然是大多数编译器足够支持的东西)

【问题讨论】:

标签: c++ c function-pointers


【解决方案1】:

你可以这样做:

#include <stdio.h>

void foo(int a)
{
    printf("foo\n");
}

void bar(char* a, double b)
{
    printf("bar\n");
}

void baz(void)
{
    printf("baz\n");
}

int main()
{
    void (*arr[])() = {foo, bar, baz};

    arr[0](1, 1, 2);
    arr[1]("test", 2.0);
    arr[2]();
}

函数指针中的空参数列表表示未指定数量的参数。但是当你调用一个函数时,你必须记住参数。其他参数将被忽略(请参阅arr[0](1, 1, 2);)。参数太少是个问题。

【讨论】:

  • 这不会可靠地工作。 void (*arr[])() 是一个指针数组,指向带有不确定数量参数的函数。像这样的函数的参数经过default argument promotions,像void foo(int a) 这样的函数不期望。这可能看起来有效,但它是错误的。
猜你喜欢
  • 1970-01-01
  • 2019-03-28
  • 2010-12-06
  • 2021-01-24
  • 1970-01-01
  • 2013-02-28
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多