宏在 C 中编译,但在 C++ 中不编译(MSP432 BSL 调用)

Macro compiles in C but not in C++ (MSP432 BSL invocation)

我正在尝试在 TI MSP432P401R 设备上调用 BSL(引导加载程序)。 以下宏在 C 中编译正确,但在使用 C++ 时失败,错误为 "Too many arguments to function"。 C++ preprocessor/compiler 有什么不同之处?

/******************************************************************************
* 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);
}

在 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)