【问题标题】:Embedded C - Too many arguments to function (pointer)嵌入式 C - 函数参数过多(指针)
【发布时间】:2012-01-08 18:31:18
【问题描述】:

我正在尝试在我的 .cpp 文件中调用以下宏:

#define IAP_ROM_LOCATION                0x1FFF1FF1UL
#define IAP_EXECUTE_CMD(a, b)           ((void (*)())(IAP_ROM_LOCATION))(a, b)

但是,当我这样调用所述函数时:

IAP_EXECUTE_CMD(0, 0);

我收到一条错误消息,指出指定的参数过多?这怎么样?我将不胜感激。

开发环境是 GCC for Cortex-M3。

【问题讨论】:

    标签: c gcc embedded


    【解决方案1】:

    为了可读性,为要调用的函数定义一个签名:

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

    【讨论】:

      【解决方案2】:
      (void (*)())(IAP_ROM_LOCATION)
      

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

      【讨论】:

        【解决方案3】:

        好的,我的 C 相当生疏,但在我看来,您的 IAP_EXECUTE_CMD() 宏将无符号长地址转换为指向返回 void 并接受零参数的函数的指针。因此,传递给函数调用的任何参数都会太多。

        【讨论】:

          【解决方案4】:

          你也可以只用宏来做:

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

          【讨论】:

            猜你喜欢
            • 2014-09-08
            • 1970-01-01
            • 2016-09-07
            • 1970-01-01
            • 1970-01-01
            • 2017-11-28
            • 1970-01-01
            • 1970-01-01
            • 2017-07-13
            相关资源
            最近更新 更多