我问的是在C语言环境下的问题,尽管它实际上适用于任何支持指针或按引用传递功能的语言。

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

  • 返回该对象类型的实例并进行分配,例如如果X的类型为T,那么我们将有:T func(){...}X = func();
  • 传递指向对象的指针/引用,并在函数内部对其进行修改,然后返回void或其他某个值(例如,在C中,许多函数返回对应于操作成功/失败的int)。这方面的一个示例是:
    int func(T* x){...x = 1;...}func(&X);

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

    谢谢!

    最佳答案

    有一个原因,您应该始终考虑使用第二种方法,而不是第一种。如果查看整个C标准库的返回值,您会注意到,它们中几乎总是包含错误处理元素。例如,您必须先检查以下函数的返回值,然后再假定它们已成功完成:

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

  • 还有其他遵循此模式的非标准功能:
  • pthread_create
  • socketconnect
  • openreadwrite等。

  • 一般而言,返回值会传递许多已成功读取/写入/转换的项,或者传送 bool 值成功/失败的值,在实践中,几乎总是需要这样的返回值,除非您要使用exit(EXIT_FAILURE);任何错误(在这种情况下,我宁愿不使用您的模块,因为它们使我没有机会在自己的代码中进行清理)。

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

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

    关于c - 两种编写函数的方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32021657/

    10-11 23:08
    查看更多