我正在尝试在.cpp文件中调用以下宏:
#define IAP_ROM_LOCATION 0x1FFF1FF1UL
#define IAP_EXECUTE_CMD(a, b) ((void (*)())(IAP_ROM_LOCATION))(a, b)
但是,当我像这样调用所述函数时:
IAP_EXECUTE_CMD(0, 0);
我收到错误,说明指定了太多参数?这怎么样?我会很感激任何指针。
开发环境是Cortex-M3的GCC。
答案 0 :(得分:15)
为了便于阅读,请为要调用的函数定义签名:
typedef void signature_t(int, int);
然后你可以投射你的ROM位置
#define IAP_EXECUTE_CMD(a, b) ((signature_t*)IAP_ROM_LOCATION) ((a),(b))
并且最近的GCC(当前版本的GCC 4.6 )我会将其作为内联函数
static inline void iap_execute_cmd(int a, int b) {
((signature_t*)IAP_ROM_LOCATION) ((a),(b));
}
答案 1 :(得分:5)
(void (*)())(IAP_ROM_LOCATION)
这部分将IAP_ROM_LOCATION
转换为指向不带参数的函数的指针,并且不返回任何内容(void (*)()
)。因此,当您想要将任何参数传递给该函数时,会出现错误。
答案 2 :(得分:2)
您也可以仅使用宏来执行此操作:
#define IAP_ROM_LOCATION 0x1FFF1FF1UL
#define IAP_FUNC_SIGNATURE void (*)(int, int)
#define IAP_EXECUTE_CMD(a, b) ((IAP_FUNC_SIGNATURE)(IAP_ROM_LOCATION))((a), (b))
答案 3 :(得分:1)
好吧,我的C相当生疏,但在我看来,你的IAP_EXECUTE_CMD()宏正在将无符号长地址转换为指向函数的指针,该函数返回void并接受零参数。因此,传递给函数调用的任何参数都会太多。