【问题标题】:Calling different functions in Struct (C) [closed]在 Struct (C) 中调用不同的函数 [关闭]
【发布时间】:2021-03-27 05:10:16
【问题描述】:

我正在努力解决一个问题,希望有人可以帮助我。

我有一个这样的结构:

struct example {

     char *name;

      int (*func1)(int x, char c, double z);
      int (*func2)(int x, float y, char c);

   }example;

所以我得到了 2 个带有参数列表的函数指针。就我而言,我想使用一组不同的参数来调整这些函数,具体取决于变量“name”的值的名称。

我需要在我的结构中包含这些函数指针,我也不能只向其中添加其他函数。有谁知道如何实现它?

BR

【问题讨论】:

  • 请张贴实际代码。 *char name; 显然是语法错误,所以贴出来的代码不会编译。你的意思是char *name;?还有哪些不同之处?
  • 坦率地说,我怀疑我们正在查看meta.stackexchange.com/questions/66377/what-is-the-xy-problem,并且您的实际问题的答案可能是“使用 C++”。如果不是答案,恐怕,可能是“你描述的那些限制是不可能的”。两者都意味着您应该尝试退后一步,并尝试通过做您描述的事情来描述您想要实现的目标。
  • @TomKarzes 基本上是对的。但是在这里展示的最好的东西是minimal reproducible example,它展示了你想要做什么,你有什么问题,或者最好两者兼而有之。 (汤姆,我假设您知道将 [mre] 输入到像您这样的适当 cmets 的神奇快捷方式。)
  • "我想用一组不同的参数调整这些函数"是什么意思?您是说要根据name 的值调用func1func2
  • 我可能误解了这个问题,但您似乎只想要if(strcmp(example.name, "foo")) {example.func1(x, c, z); } else { example.func2(x, y, c);}

标签: c function pointers struct parameters


【解决方案1】:

您需要的是一个联合,它允许您将指针定义为指向具有不同签名的函数的指针。这有点笨拙,但如果传递了不适当的函数参数,编译器会警告你,你会从中受益。

struct example {
   char *name;
   union {
      struct {
         int (*func1)(int x, char c, double z);
         int (*func2)(int x, float y, char c);
       } type1;
       struct {
         int (*func1)(char *p1);
         int (*func2)(int x, char *p1);
       } type2;
    } u;
} example;

给定一个example的实例:

struct example *e = flar(some parameters);

您可以像这样执行func1func2

if (!strcmp(e->name, "type1")) {
   int r1 = e->u.type1.func1(1, 'a', 3.5);
   int r2 = e->u.type1.func2(2, 4.2, 'b');
} else if (!strcmp(e->name, "type2")) {
   int r1 = e->u.type2.func1("42");
   int r2 = e->u.type2.func2(42, "6*7");
} else {
   fprintf(stderr, "bad name '%s'\n", e->name);
   exit(1);
}

或者,您可以将它们指定为没有参数,但您必须确保,正如 Raymond 所提到的,所有函数都是使用提升类型定义的,否则会发生提升。当然,当你这样做时,如果你在调用者中犯了错误,编译器将无法警告你。

【讨论】:

  • "你可以将它们指定为没有参数" - 在这种情况下你不能因为一些参数是 charfloat 被提升为 intdouble (分别)在没有原型的情况下。
猜你喜欢
  • 1970-01-01
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-20
  • 2021-02-15
相关资源
最近更新 更多