函数指针的调用代码在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++的环境下编译不通过.
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
xiaoergao
1楼-- · 2020-01-01 20:05
javenreal 发表于 2017-3-5 19:55
把第二个函数改成这样:void testFloat(int a){                 printf("testFloat a = %f " , (float)a ...

这样传过来的a的值会变掉
javenreal
2楼-- · 2020-01-01 23:45
 精彩回答 2  元偷偷看……
xiaoergao
3楼-- · 2020-01-02 01:39
javenreal 发表于 2017-3-5 22:38
testFloat这样的函数不要用值传。参数用void *,在函数内再转换成int *或float *

之前的做法是:
先取地址-》再转为对应类型的指针类型-》再取值

这样做一直没问题。但是弊端就是只能转成固定的数据类型,而不是根据数据的不同转换成不同的数据类型。
huangqi412
4楼-- · 2020-01-02 01:50
你这用C也没实现吧。   N个test_XXX(A,B,C,D,E,F)          *P = TEXT_XXX    你这不还是要先确认XXX是哪个么   
takashiki
5楼-- · 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. }
复制代码
canspider
6楼-- · 2020-01-02 08:44
xiaoergao 发表于 2017-3-5 22:23
首先感谢您的回复

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

为什么不转成统一的类型再计算
比如统一转成float的
如果你觉得精度不够,也可以统一转成一个自定义的格式
比如64位有效数字,32位指数

一周热门 更多>