1

我正在尝试在 TI MSP432P401R 设备上调用 BSL(引导加载程序)。以下宏在 C 中正确编译,但在使用 C++ 时失败,并出现错误“函数参数过多”。C++ 预处理器/编译器有什么不同?

/******************************************************************************
* BSL                                                                         *
******************************************************************************/
#define BSL_DEFAULT_PARAM                        ((uint32_t)0xFC48FFFF)          /*!< I2C slave address = 0x48, Interface selection = Auto */
#define BSL_API_TABLE_ADDR                       ((uint32_t)0x00202000)          /*!< Address of BSL API table */
#define BSL_ENTRY_FUNCTION                       (*((uint32_t *)BSL_API_TABLE_ADDR))

#define BSL_AUTO_INTERFACE                       ((uint32_t)0x0000E0000)         /*!< Auto detect interface */
#define BSL_UART_INTERFACE                       ((uint32_t)0x0000C0000)         /*!< UART interface */
#define BSL_SPI_INTERFACE                        ((uint32_t)0x0000A0000)         /*!< SPI interface */
#define BSL_I2C_INTERFACE                        ((uint32_t)0x000080000)         /*!< I2C interface */

#define BSL_INVOKE(x)                            ((void (*)())BSL_ENTRY_FUNCTION)((uint32_t) x) /*!< Invoke the BSL with parameters */

int main()
{
    BSL_INVOKE(BSL_UART_INTERFACE);
}
4

1 回答 1

4

在 C 中,类型void f()函数意味着接受任何参数的函数 - 这是 C 中过时的样式,但仍然允许。

在 C++ 中,void f()表示等效于 的函数void f(void),因此您不能将任何参数传递给它。

你不应该在 C 和 C++ 中使用这一行:

((void (*)())BSL_ENTRY_FUNCTION)((uint32_t) x)

将它以及函数声明更改为:

((void (*)(uint32_t))BSL_ENTRY_FUNCTION)((uint32_t) x)
于 2019-09-06T07:46:29.497 回答