我问的是在C语言环境下的问题,尽管它实际上适用于任何支持指针或按引用传递功能的语言。
我来自Java背景,但是已经编写了足够的低级代码(C和C++)来观察这种有趣的现象。假设我们有一些对象X(这里用严格意义上的OOP来不使用“对象”),我们想通过其他一些函数来填充信息,看来有两种方法可以做到:
T func(){...}
X = func();
void
或其他某个值(例如,在C中,许多函数返回对应于操作成功/失败的int
)。这方面的一个示例是:int func(T* x){...x = 1;...}
func(&X);
我的问题是:在什么情况下一种方法比另一种方法更好?它们是实现相同结果的等效方法吗?每个都有哪些限制?
谢谢!
最佳答案
有一个原因,您应该始终考虑使用第二种方法,而不是第一种。如果查看整个C标准库的返回值,您会注意到,它们中几乎总是包含错误处理元素。例如,您必须先检查以下函数的返回值,然后再假定它们已成功完成:
calloc
,malloc
和realloc
getchar
fopen
scanf
和家庭strtok
还有其他遵循此模式的非标准功能:
pthread_create
等socket
,connect
等open
,read
,write
等。一般而言,返回值会传递许多已成功读取/写入/转换的项,或者传送 bool 值成功/失败的值,在实践中,几乎总是需要这样的返回值,除非您要使用
exit(EXIT_FAILURE);
任何错误(在这种情况下,我宁愿不使用您的模块,因为它们使我没有机会在自己的代码中进行清理)。标准C库中有一些不使用此模式的函数,因为它们不使用资源(例如分配或文件),因此不会出现任何错误。例如,如果您的函数是基本的转换函数(例如
toupper
,tolower
和可转换单个字符值的 friend ),那么您就不需要返回值来进行错误处理,因为没有错误。我认为您确实会发现这种情况确实很少见,但是如果您的情况确实如此,则请务必使用第一种选择!总之,为了与世界其他地区保持一致,您应该始终高度考虑使用选项2,保留返回值以作类似用途,因为您以后可能会决定需要返回值来传达错误或数字。已处理的项目。
关于c - 两种编写函数的方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32021657/