0

这是一个非常简单的问题。

说我有一个功能:

 int fun(int n){
     if (n > 3)
         return n;
     else
         fail(); // this function outputs error message 
                 // and terminates the program
                 // no return value
 }

然后对于 n <=3 的情况没有返回值。如何解决这个问题?

4

6 回答 6

6

如果您只是想消除有关“控制到达非 void 函数的结尾”或类似内容的警告,则可以fail()使用一些特定于编译器的指令进行装饰,以指示它不会返回。例如,在 GCC 和 Clang 中,这将是__attribute__((noreturn))

例子:

$ cat example.cpp 
void fail(void);

int fun(int n)
{
  if (n > 3)
    return n;
  else
    fail();
}
$ clang++ -c example.cpp 
example.cpp:9:1: warning: control may reach end of non-void function
      [-Wreturn-type]
}
^
1 warning generated.
$ cat example2.cpp 
void fail(void) __attribute__((noreturn));

int fun(int n)
{
  if (n > 3)
    return n;
  else
    fail();
}
$ clang++ -c example2.cpp
$
于 2013-09-06T04:27:35.603 回答
5
int fun (int n)
{
    if (n <= 3) { fail(); /* Does not return. */ }
    return n;
}
于 2013-09-06T04:26:41.927 回答
1

一种可能的习惯用法是定义fail为返回一个 int 然后写:

int fun(int n){
    if (n > 3)
        return n;
    else
        return fail();                            

}
于 2013-09-06T04:30:07.467 回答
0

另一种巧妙的方法是使用boost::optional作为返回值。这将表明返回值在失败情况下很多都没有设置,调用者可以进一步检查以采取后续行动。

于 2013-09-06T05:36:42.563 回答
0

您可以声明一个错误代码,表明该函数有问题。

例如:

const int error_code = -1;

int fun (int n) {

    if (n > 3) 
        return n;

    fail();
    return error_code;

}
于 2013-09-06T04:33:42.033 回答
-1

基于 Aesthete 的回答:

int fun (int n)
{
    if (n <= 3) { fail(); return -1; } //-1 to indicate failure
    return n;
}
于 2013-09-06T04:28:15.143 回答