C语言中的返回值未定义

3

不确定我是否过于考虑了这个问题,但是当参数超出需要的范围时,我应该如何返回未定义的内容?

我正在尝试做以下操作:

uint64_t function(uint64_t Value, uint64_t N) {
   uint64_t result = 0;

   if (N > 0){
     //do something;
     return result;
   }
   else{
     return result is undefined;
   }
}

如何解决N未定义的问题?


3
好的,一种选择是:http://en.wikipedia.org/wiki/Sentinel_value - Stuart Golodetz
在您的情况下,取决于函数可能返回的值的范围。如果您知道此范围,则可以选择一个超出该范围的值作为未定义值。 - Ashalynd
一种可能性是像C库调用一样设置errno = ERANGE。 - Jim Balter
3个回答

5

一种解决方法是返回一个状态,并使用OUT参数,如下所示:

bool function(uint64_t Value, uint64_t N, uint64_t *result) {

   if (N > 0){
     //do something;
     *result = 31337;
     return true;
   }
   else{
     return false;
   }
}

然后,当您调用此函数时,请在使用结果之前检查函数是否返回 true。


我不能将它改为布尔类型。它必须是 uint64_t 类型的函数。 - Tavo
1
@Tavo 那就使用 uint64_t function(..., bool *isUndefined) 的原型吧。 - user3125367

3

对于整数类型,你无法这样做。

uint64_t类型有2的64次方个可行值,每个值都是有效的整数值。

在某些情况下,您可以选择一个值(例如UINT64_MIN),将其视为错误指示,并返回该值--但这并不总是可行的。

或者,您可以让函数返回成功或失败的结果,并通过其他方式向调用者传递uint64_t值,可能是通过由调用者传入的指针来存储它。


如果我执行:...否则{return -1;}} N必须大于0,否则函数应返回未定义。 - Tavo
@Tavo:如果你在一个返回uint64_t的函数中使用return -1;,那么-1将会被转换为18446744073709551615。对于uint64_t来说,不存在未定义的值——除非你按照约定自己定义了它。 - Keith Thompson

1
另一种选择是返回一个结构体。这在C++中效果更好(看看Boost Optional),但这里有一个C版本:
#include <stdio.h>
#include <stdbool.h>

struct optional_int {
    bool valid;
    int  value;
};

struct optional_int f(int x)
{
    struct optional_int result = {false, 0};
    if(x > 0 && x < 10) {
        result.valid = true;
        result.value = x * 1024;
    }
    return result;
}

int main()
{
    struct optional_int v;

    v = f(9);
    if(v.valid) {
        printf("Result is %d\n", v.value);
    }
    return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接