嵌入式C语言 - 函数(指针)传递过多的参数

5

我正在尝试在我的.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。

4个回答

15

为了提高可读性,定义被调用函数的签名:

typedef void signature_t(int, int);

那么你可以将你的 ROM 位置进行转换

#define IAP_EXECUTE_CMD(a, b)  ((signature_t*)IAP_ROM_LOCATION) ((a),(b))

最近GCC的版本是4.6,我会将其作为内联函数。

static inline void iap_execute_cmd(int a, int b) {
    ((signature_t*)IAP_ROM_LOCATION) ((a),(b));
}

5
(void (*)())(IAP_ROM_LOCATION)

这部分将 IAP_ROM_LOCATION 转换为一个不带参数且返回值为 void (*)() 的函数指针。因此,当您想传递任何参数给该函数时,就会出现错误。


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

1

好的,我的 C 语言有点生疏,但我觉得你的 IAP_EXECUTE_CMD() 宏将无符号长整型地址转换为返回 void 类型且不接受任何参数的函数指针。因此,传递给函数调用的任何参数都会过多。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接