C语言没有goto out
只有goto语句——无条件跳转
后面的out是程序员自己定义的标号。
goto语句因为打乱程序流程,使用不当会产生很多后果,所以要慎用(在没完全理解它之前,千万别用)。
在HAL库中,不少位置使用到goto语句。比如“stm32f1xx_hal_spi.c”里,截取片段供学习
HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi uint8_t *pData uint16_t Size uint32_t Timeout) { uint32_t tickstart = 0U; HAL_StatusTypeDef errorcode = HAL_OK; /* Process Locked */ __HAL_LOCK(hspi); /* Init tickstart for timeout management*/ tickstart = HAL_GetTick(); if(hspi->State != HAL_SPI_STATE_READY) { errorcode = HAL_BUSY; goto error; //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< } if((pData == NULL ) || (Size == 0U)) { errorcode = HAL_ERROR; goto error; //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< } //..略 while (hspi->TxXferCount > 0U) { /* Wait until TXE flag is set to send data */ if(__HAL_SPI_GET_FLAG(hspi SPI_FLAG_TXE)) { *((__IO uint8_t*)&hspi->Instance->DR) = (*pData); pData += sizeof(uint8_t); hspi->TxXferCount--; } else { /* Timeout management */ if((Timeout == 0U) || ((Timeout != HAL_MAX_DELAY) && ((HAL_GetTick()-tickstart) >= Timeout))) { errorcode = HAL_TIMEOUT; goto error; //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< } } } //..略 if(hspi->ErrorCode != HAL_SPI_ERROR_NONE) { errorcode = HAL_ERROR; } error: //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< hspi->State = HAL_SPI_STATE_READY; /* Process Unlocked */ __HAL_UNLOCK(hspi); return errorcode; }
goto 在驱动里面用的多,主要是在 probe 里面用的很多,但是仅仅局限于 probe 内 goto ,不会跨函数 goto,goto 是个不建议使用的语句
out 不懂
没有goto out这个语法吧
应该是goto语句,这是一个跳转的关键字,out是goto可以识别的一个关键字段,使用这个语句的话会跳转到out字段之后执行,这个语句具有很高的危险性,所以一般情况是禁止使用的,如果程序不是很复杂的话可以使用,复杂程序不建议使用,这样可读性很差,一般都是使用while和for语句进行代替的。