【发布时间】:2016-11-05 17:21:36
【问题描述】:
我想将 ptr 传递给函数并让函数确定该值是数字还是 NULL。这样做的原因是为了避免编写两个函数,一个来检查 C 内置函数中通常返回的错误指示符。
目前,我正在使用两个重复的函数,一个用于检查返回的 int 和 -1,另一个用于检查返回的 char *ptr 和 NULL。这在某种程度上违反了 DRY,因为这两个函数的操作在测试之外是相同的。我曾考虑编写第三个函数来处理该操作,但我想与社区核实一下,看看是否有更好的方法。
我想要完成的示例代码:
#include <stdio.h>
#include <netinet/in.h>
#include <sys/socket.h>
typedef union combo_tag {
int i;
FILE *fp;
} combo;
int foo(combo test) {
if (test.fp == NULL || test.i == -1) {
printf("error\n");
return -1;
}
return 0;
}
int main() {
combo a;
// attempt to produce an error
a.fp = fopen("/tmp/somthing-that-does-not-exist/file", "a");
a.i = socket(AF_INET, SOCK_DGRAM, IPPROTO_TCP);
return foo(a);
}
【问题讨论】:
-
一个 int 不能为空。您可以将 a 声明为 int* 并将其设置为 null。
-
另外,您应该检查
ptr == NULL || *ptr == -1。这样你就可以在取消引用 null 之前短路。并且您应该通过打印到屏幕以外的方式来指示错误。除此之外,您的foo是正确的。 -
如果你想使用 foo 进行任何有意义的工作流控制,你仍然需要再次在调用者中处理它的结果。
-
@o_weisman
NULL在许多系统上的值为 0,而令人惊讶的是,int的类型经常是。所以虽然int可以有NULL的值,但这不是OP 需要编码的。 -
你真正的问题是你没有统一的错误检查系统。让你的所有函数都返回一个错误代码,例如
enum,然后检查那个。我建议你解决这个真正的问题,而不是创建一些丑陋的人为补丁。