函数指针的调用代码在C环境能编译通过 换到C++就不可以

2019-12-30 19:26发布

代码如下
        void testInt(int a){
                printf("testInt a = %d " , a);
        }

        void testFloat(float a){
                printf("testFloat a = %f " , a);
        }
       
        void run(){
                void* funp;
                funp = testInt;
                (*(u32(*)())funp)(3);
        }


主要是想在DEBUG的时候通过一个函数指针调用需要调试的函数, 但是函数的数据类型不知道. 这段代码在C里面可以编译成功, 但是在C++的环境下编译不通过.
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
20条回答
takashiki
2020-01-02 04:27
xiaoergao 发表于 2017-3-5 22:23
首先感谢您的回复

你提到的应用场景是在源程序里面这样使用是可以的。

如果你重载了256个函数,那你说的没错。无论你怎么折腾,都是避免不了的。
然而,办法还是有的,比如这样,C/C++通用,无论考虑各种条件,伪代码如下:
  1. typedef union{
  2.     int Int[8];
  3.     float Float[8];
  4. } CParam;

  5. static void test0(CParam p){                               //8个参数全为int
  6.         printf("testInt p = %d %d %d %d %d %d %d %d " , p.Int[0], p.Int[1], p.Int[2], p.Int[3], ...);
  7. }

  8. static void test1(CParam p){                              //8个参数:int int int int int int int float
  9.         printf("testInt p = %f %d %d %d %d %d %d %d " , p.Float[0], p.Int[1], p.Int[2], p.Int[3], ...);
  10. }

  11. ...

  12. typedef void(*pfnFun)(CParam);
  13. const pfnFun fnFuncs[] = {test0, test1, ...};
  14.         
  15. void run(){
  16.     int type = 0;     // 获取参数样式
  17.     CParam prm;    // 参数列表,根据你的串口填充是int还是float
  18.     char* param[8];    //从你的串口中分离出来的参数。最简单的方法:将逗号换成0x00就好了,然后填充下一个参数

  19.     for(int i = 0; i<8; i++){
  20.         if(strstr('.', param[i])){                //float
  21.                prm.Float[i] = atof(param[i]);
  22.                type |= 1 << i;
  23.         } else
  24.               prm.Int[i] = atoi(param[i]);
  25.     }

  26.     fnFuncs[type](prm);
  27. }
复制代码

一周热门 更多>