【问题标题】:warning: (343) implicit return at end of non-void function警告:(343)在非无效函数末尾隐式返回
【发布时间】:2019-10-27 16:06:47
【问题描述】:

当从函数返回指针令牌时,我收到了警告。以下代码不完整,请缩短以免混淆。

  char *ServerResponds()        
    {
        char copy_wifi_data[EUSART_BUFFER_SIZE];                               
        uint16_t i = 0; int tok_count = 0;            

        static char *token;
        token = strtok(copy_wifi_data, ":");               //Converting wifi data to tokens.

        while(token != NULL)
        {  
            if(tok_count == 1)
            {
                return token;
            }

            token = strtok(NULL,":");  
            tok_count++;
        } 
    }

【问题讨论】:

  • 如果条件永远不成立怎么办?函数返回什么?
  • @tkausl 该函数返回一个指向字符串的指针。因为没有必要,所以我没有写 else 语句。
  • 如果这里有省略的代码,你应该用...指出。此代码在其他方面不可信 - 例如,copy_wifi_data 未初始化,i 未使用。此外,声明token static 的目的是什么?有一点代码味道。
  • @PraveenKumarPS:你错过了重点——tkausl 指的是while 的条件。如果第一个strtok() 返回NULL,则不会进入while 循环,函数以无显式返回结束。您可能希望它在实践中永远不会发生,但编译器无法知道这一点,坦率地说您也不知道。

标签: embedded microcontroller microchip xc8


【解决方案1】:

出现警告是因为在tok_count == 1为假的情况下没有return语句。

char *ServerResponds()        
{
    char copy_wifi_data[EUSART_BUFFER_SIZE];                               
    uint16_t i = 0; int tok_count = 0;            

    static char *token;
    token = strtok(copy_wifi_data, ":");               

    while(token != NULL)
    {  
        if(tok_count == 1)
        {
            return token;
        }

        token = strtok(NULL,":");  
        tok_count++;
    } 
    /* <--- there is no return if control flow reaches this point */

}

您可以在函数末尾添加return 0; 来解决此问题,但您必须记录此行为并确保调用者准备好处理空返回值。

【讨论】:

  • 为什么是return 0; 而不是return NULL;?确实,这对于编译器来说是一样的,但在视觉上更容易识别正在发生的事情。
【解决方案2】:

该函数不会通过所有可能的执行路径返回值。

虽然您可以在 while 循环之后添加 return NULLreturn token,但从单个函数中获取多个返回点可能被认为是不好的做法 - 这违反了许多常见的编码标准,并且在大多数情况。

    //Converting wifi data to tokens.
    static char *token  = strtok(copy_wifi_data, ":");               
    while( tok_count == 0; token != NULL )
    {  
        token = strtok(NULL,":");  
        tok_count++;
    }

    return token ; 

也就是说,尚不清楚 while 循环的目的是什么,或者为什么 tokenstatic。它在语义上与:

    //Converting wifi data to tokens.
    char *token = strtok(copy_wifi_data, ":");               
    if( token != NULL )
    {  
        token = strtok(NULL,":");  
    }

    return token ; 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-11
    • 2014-07-14
    • 2015-04-16
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    相关资源
    最近更新 更多