【问题标题】:Unknown return type for a C functionC 函数的未知返回类型
【发布时间】:2010-08-05 17:51:58
【问题描述】:

我正在为 C 编写一个库,一个函数可以返回字符串 (char *)、整数或双精度数。除此之外,字符串的长度是未知的。我真的不知道如何处理这个问题。我想过使用指针作为函数的参数,但这真的很麻烦。

谁能给我一个解决方案,或者一些简短的示例代码?谢谢。


编辑

将 void 指针作为返回类型,将返回值大小的指针作为参数:

void* func(int x, int y, int *size) { ... }
/* or */
void* func(int x, int y, int &size) { ... }
/* always confused about them ): */

?

【问题讨论】:

  • 您可以通过联合或其他方式完成此操作,但请先问问自己您是否真的需要这样做。还有其他方法可以解决根本问题吗?如果没有,为什么不呢?
  • 它与键值有关。键始终是字符串,值可以是任何类型。
  • 哦,当然!程序员知道值的类型。那将是不同的功能。
  • 你给出的第二个例子是无效的C。参考来自C++。
  • 关于您编辑中的示例代码,请使用int *int & 形式是 C++。如果您要在这样的参数中返回数据,则通过参数返回 all 的数据。部分返回值和部分参数返回可能更令人困惑。

标签: c function return-type


【解决方案1】:

如果一个函数可以返回多种类型,我不建议使用联合(至少不是单独使用)。您的函数需要返回两条信息:结果和结果类型。使用这样的结构,您可能会获得最大的收益:

enum return_val_type {STRING, INT, DOUBLE};
struct return_val {
    enum return_val_type return_type;
    union {
        char*  s;
        int    i;
        double d;
    };
};

这样,调用者可以检查return_type 的值并确定他们需要如何解释数据(即使用哪个联合字段)。

【讨论】:

    【解决方案2】:

    这听起来很糟糕的设计,但如果您觉得出于某种原因必须这样做,那么您可以使用联合来返回不同的类型。

    【讨论】:

    • 我喜欢联合的想法。现代 C 支持将联合作为函数值返回,不是吗?
    • 工会真的有用吗?调用者如何知道要访问哪个联合字段?
    • @bta: 如果你不能从上下文推断返回类型(这会有点奇怪,但我们已经知道这是一个糟糕的设计)那么你总是可以将联合嵌入到结构中带有一个枚举字段,它表示联合中的有效类型。
    • @Carl:是的,我认为只有最初的 K&R C 缺乏这种能力——从 C89 开始的一切都允许函数返回结构和联合。
    【解决方案3】:

    你将不得不重新设计你的函数,或者根据类型拥有多个版本。

    想想看 - 编译器将如何处理它?假设实现在一个单独的 .c 文件中,该函数对编译器来说是一个黑盒子,所以它不知道会发生什么。

    您可以为每种类型提供一个函数版本,或者返回一个指针,或者将指针作为参数并将值存储在其中(如果结果的大小未知,这可能是不安全的)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-26
      • 1970-01-01
      相关资源
      最近更新 更多