【问题标题】:Can I make a C function return an arbitrary type?我可以让 C 函数返回任意类型吗?
【发布时间】:2014-06-16 17:41:58
【问题描述】:

我编写了一个解释串行数据 (CAN) 并当前返回浮点数的函数。我希望该函数包含一个参数,其中用户在字符串中指定返回类型,并且该函数返回该类型的值。这只是一件方便的事情,以避免编写多个共享几乎所有相同代码的函数。

【问题讨论】:

  • @Lynn:他说 c 不是 c++。
  • 链接显示“C 中的模板模拟”。所以它们并不是真正的模板,而是一个 C++ 构造。最好对此非常清楚,以免造成混淆。
  • @Lynn,我没有点击链接。我会点击链接!
  • @Lynn。我同意,将函数编码为宏是另一种方法。起初我以为你的评论是一个恶作剧(对不起!)。使用宏对函数进行编码将消除类型测试,但代价是一些复杂性。在许多情况下是公平的交易。

标签: c types


【解决方案1】:

将 void 指针传递给您想要返回的数据类型。

void foo(char* szType, void *pOut) {
  switch (szType[0]) {
    case 'I': *(int*)pOut = 1; break;
    case 'F': *(float*)pOut = 1; break;
  }
}

这样使用:

int a;
float b;
foo("I", &a);
foo("F", &b);

【讨论】:

  • 更好的答案;我的被​​删除了。 :)
  • +1 是的.. 鉴于这种范式与模拟模板方法相比,这更清洁、更容易、更快地编写代码......并且更容易阅读。
  • @Lynn,但如果需要,模拟模板方法的性能会更高。
  • @chux:他说将字符串作为参数。我会像你说的那样使用字符或枚举。
  • 是的,现在请参阅“用户在字符串中指定返回类型”。
【解决方案2】:

johnnycrash 的回答是正确的,但是如果您想返回 一个特定类型的对象(而不是使用 call-with-parameter-equal to void * 指针),还有另一种方法。这通过返回请求类型的malloc()'d 对象来工作。

#include <stdio.h>
#include <stdlib.h>

void *
foo (char *mytype)
{
  switch (mytype[0])
    {
    case 'I':
      {
        int *i = malloc (sizeof (int));
        *i = 1;
        return i;
      }
    case 'F':
      {
        double *d = malloc (sizeof (double));
        *d = 1.234;
        return d;
      }
    default:
      return NULL;
    }
}

int
main (int argc, char **argv)
{
  int *ii;
  double *dd;

  ii = foo ("I");
  printf ("Integer is %d\n", *ii);
  free (ii);

  dd = foo ("F");
  printf ("Double is %f\n", *dd);
  free (dd);
  exit (0);
}

【讨论】:

  • 啊,好一个!还有一种内部缓冲区方法,它不是线程安全的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 2021-05-13
  • 1970-01-01
相关资源
最近更新 更多