C 如何解决编译警告时函数的弃用声明?

C 如何解决编译警告时函数的弃用声明?,c,embedded,compiler-warnings,keil,C,Embedded,Compiler Warnings,Keil,我有3个文件依赖项,在其中一个文件依赖项中,我实现了一个函数,您可以在下面首先看到。它返回一个32位的int类型。第二个文件实现了一个调用第一个文件函数的函数。此函数将从主文件(第三个文件)调用。 当我编译(使用keil IDE)所有文件时,我有以下警告消息: compiling App_Task_CAN.c... ..\src\Application_Tasks\App_Task_CAN.h(132): warning: #1295-D: Deprecated declaratio

我有3个文件依赖项,在其中一个文件依赖项中,我实现了一个函数,您可以在下面首先看到。它返回一个32位的int类型。第二个文件实现了一个调用第一个文件函数的函数。此函数将从主文件(第三个文件)调用。 当我编译(使用keil IDE)所有文件时,我有以下警告消息:

compiling App_Task_CAN.c...
..\src\Application_Tasks\App_Task_CAN.h(132): warning:  #1295-D: Deprecated      declaration App_Task_CAN_GetError - give arg types
  uint32_t App_Task_CAN_GetError();
这是我包含的stm32l4xx_hal_can.c文件中的一部分代码:

 uint32_t HAL_CAN_GetError(CAN_HandleTypeDef *hcan)
 {
      return hcan->ErrorCode;
 }
其中,hcan位于stm32l4xx_hal_can.h中,是一种:

   /**
   * @brief  CAN handle Structure definition
   */
 typedef struct
 {
     CAN_TypeDef                 *Instance;  /*!< Register base address          */

     CAN_InitTypeDef             Init;       /*!< CAN required parameters        */

     CanTxMsgTypeDef*            pTxMsg;     /*!< Pointer to transmit structure  */

     CanRxMsgTypeDef*            pRxMsg;     /*!< Pointer to reception structure */

     __IO HAL_CAN_StateTypeDef   State;      /*!< CAN communication state        */

     HAL_LockTypeDef             Lock;       /*!< CAN locking object             */

     __IO uint32_t               ErrorCode;  /*!< CAN Error code                 */ 

}CAN_HandleTypeDef;
Main.c中的主代码:

int main(void)
{
    uint32_t    ErrorType=0;

    while (1)
    {
        ErrorType=App_Task_CAN_GetError(); //it takes the resulting value of calling HAL_CAN_GetError(&HCAN_Struct)
    }
}
当我通过一个论点时,警告消失了。但我不知道为什么它要我提供一个保存返回值的参数

既然它返回uint32\u t,为什么它需要一个参数?当main调用App_Task_CAN_GetError()时,是否可以改进代码以从main获取更新的ErrorType

注意:不能修改stm32l4xx_hal_can.c和.h,因为它们是系统库文件。

使用声明

int foo(void) 
int f() 
表示返回
int
不接受任何参数的函数。 宣言

int foo(void) 
int f() 
表示返回
int
的函数,该函数接受任意数量的参数


因此,如果您有一个不带任何参数的函数,那么前者就是正确的原型。

uint32\u t App\u Task\u CAN\u GetError()
-->
uint32\u t App\u Task\u CAN\u GetError(void)
@LPs警告消失,并且工作正常。谢谢。另请注意,根据6.11.6函数声明器,“使用带空括号的函数声明器(不是原型格式参数类型声明器)是一种过时的功能”,编译器警告此功能不推荐使用是正确的