宏在 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)
我正在尝试在 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)