编写函数的两种方法

Muh*_*han 5 c pointers function

我在C语言的上下文中提出这个问题,尽管它实际上适用于支持指针或传递引用功能的任何语言.

我来自Java背景,但已经编写了足够的低级代码(C和C++)来观察这个有趣的现象.假设我们有一些对象X(这里没有使用"最严格的OOP意义上的"对象")我们希望通过其他函数来填充信息,似乎有两种方法可以做到:

  1. 返回该对象的类型并分配它的实例,例如,如果X具有类型T,那么我们将:
    T func(){...}

    X = func();

  2. 传入指向对象的指针/引用并在函数内部修改它,并返回其中一个void或一些其他值(例如,在C中,许多函数返回int对应于操作成功/失败的函数).这方面的一个例子是:

    int func(T* x){...x = 1;...}

    func(&X);

我的问题是:在什么情况下使一种方法比另一种更好?它们是实现相同结果的等效方法吗?每个都有什么限制?

谢谢!

aut*_*tic 3

您应该始终考虑使用第二种方法,而不是第一种方法,这是有原因的。如果您查看整个 C 标准库的返回值,您会发现它们几乎总是涉及错误处理元素。例如,在认为以下函数已成功之前,您必须检查它们的返回值:

  • callocmallocrealloc
  • getchar
  • fopen
  • scanf和家人
  • strtok

还有其他遵循此模式的非标准函数:

  • pthread_create, ETC。
  • socketconnect, ETC。
  • openreadwrite, ETC。

一般来说,返回值传达了一些成功读取/写入/转换的项目或一个纯粹的布尔成功/失败值,并且在实践中你几乎总是需要这样的返回值,除非你打算在任何exit(EXIT_FAILURE);时候错误(在这种情况下,我宁愿不使用您的模块,因为它们让我没有机会在我自己的代码中进行清理)。

标准 C 库中有些函数不使用此模式,因为它们不使用资源(例如分配或文件),因此不会出现任何错误。例如,如果您的函数是基本翻译函数(例如 liketouppertolower翻译单个字符值的朋友),那么您不需要返回值来进行错误处理,因为没有错误。我认为您会发现这种情况确实很少见,但如果这是您的情况,请务必使用第一个选项!

总之,您应该始终高度考虑使用选项 2,保留返回值用于类似用途,以便与世界其他地方保持一致,并且因为您稍后可能会决定需要返回值来传达错误或数字处理的物品数量。