【问题标题】:error pointer: is it okay to reserve random data to be used as error pointer?错误指针:可以保留随机数据用作错误指针吗?
【发布时间】:2016-02-26 06:02:51
【问题描述】:

我有一种情况,指针返回函数可以返回结构地址或 NULL 指针。当函数没有错误时,这两种情况都是可能的。仍然有可能出错,但我不能用 NULL 指针发出信号。那么,定义一些随机全局数据(ed. int 或 double)并使用其地址来指示错误是一种可能还是一种好的做法?

int error_variable;

func1(){
    if(func2() != &error_variable) 
    ...
}

pointer *func2(){
    ... 
    /**return some address or NULL in success,
    &error_variable otherwise*/
}

我知道可以设置像errno这样的系统,但是这种形式会缩短代码并保持可读性。有很多函数,如 func2,具有不同的返回值类型,所以 &error_variable 是否应该转换为 void * 并且它确实有效?

【问题讨论】:

  • 我不明白为什么要使用全局指针的地址,为什么不设置值?我的意思是,你返回指针并检查它的值。
  • 为什么将NULL 设为有效指针?它的全部意义是无效的,所以你可以检查。我不明白为什么在没有错误的情况下它应该返回NULL。也许您应该对此进行更多解释。我发现您的方法存在可维护性问题,不是太糟糕,但也不是很好。
  • @iharob 一般的想法是该函数使用 2 个异常返回值 NULL 和其他东西。
  • 重点是我只使用了那个全局变量的地址,因为地址不能与任何正确的返回值相同。错误地址中的内容无关紧要。不确定我是否理解您的评论(您是否理解我的问题)@terencehill
  • 我明白了,您认为该地址可以用作错误代码,因为该函数如果行为正确,将永远不会返回这样的值。在我看来,您应该重新考虑您的函数以返回一个合理的错误值,但也许您处于这样一种情况,这可能是一个有效的选项。

标签: c pointers error-handling


【解决方案1】:

那么,定义一些随机数是一种可能还是一种好的做法......

对指针使用随机值会导致未定义的行为。

那么,定义一些 random 全局数据(ed.int 或 double)并使用其地址来指示错误是一种可能还是一种好的做法?

使用指向全局变量的指针是一个不错的选择 - 确保它是匹配类型。

foo error_variable;

foo *func2() {
  ...
  return &error_variable
  }

func1() {
  if(func2() != &error_variable) 
  ...
}

【讨论】:

  • 我有更多具有不同返回值类型的函数应该与该变量一起使用。我可以在检查之前将它们转换为 void,还是每种类型都需要一个错误指针?
  • @happytomato 因为拥有void error_variable; 是个问题,所以代码可以使用void * error_variable_v 并简单地返回/比较error_variable_v 而不是&error_variable。如果foostruct,这可能会更好地防止代码尝试error_variable.some_field。最佳答案取决于未发布的更大的编码目标。
【解决方案2】:

为什么不通过输出参数返回指针,然后将返回值用作错误代码?我认为这是最干净的方法。

func1(){
    pointer *result;
    if(func2(&result) == 0) {
       if (result != NULL) {
           ...
       } else {
           ...
       } 
    }
}

int func2(pointer **result){
    ... 
    /* success case */
    *result = null_or_not ? NULL : some_pointer;
    return 0;

    /* error case */
    return error_code;
    /* in this case result could be left untouched or set to NULL.
       up to you to define the interface there. */
}

【讨论】:

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