函数指针的调用代码在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条回答
shark
1楼-- · 2019-12-31 01:23
C++要求函数指针的参数必须匹配。
void run(){
    void* funp;
    funp = testFloat;
    (*(u32(*)(float))funp)(3);
    funp = testInt;
    (*(u32(*)(int))funp)(3);
}
这样就行了。
xiaoergao
2楼-- · 2019-12-31 05:53
shark 发表于 2017-3-5 16:28
C++要求函数指针的参数必须匹配。
void run(){
    void* funp;

这样是可以  但是我希望是在运行的过程中判断串口发过来的数据是否带有小数点   如果有小数点我就转换了以后按照浮点数传参数.如果没有小数点转换后按照整形传.
如果只是一个参数还好 可以判断  但是如果好多个参数的话  就会有很多种组合.
jordonwu
3楼-- · 2019-12-31 11:28
xiaoergao 发表于 2017-3-5 17:06
这样是可以  但是我希望是在运行的过程中判断串口发过来的数据是否带有小数点   如果有小数点我就转换了 ...

用template 啊
xiaoergao
4楼-- · 2019-12-31 17:06
 精彩回答 2  元偷偷看……
takashiki
5楼-- · 2019-12-31 21:20
xiaoergao 发表于 2017-3-5 17:29
您指的是用泛型的概念么?刚才搜索到这个 正在学习.

都改用C++了,就别纠结这些有的没的了。这些是C程序需要考虑的事情。
直接函数重载,不折腾,乱七八糟的事情让编译器头疼去。要是编译器抱怨参数有歧义,就在前面加强制转换。
  1. void test(int a){
  2.      printf("testInt a = %d " , a);
  3. }

  4. void test(float a){
  5.       printf("testFloat a = %f " , a);
  6. }

  7. void run(){
  8.       test(3);                 // 如果编译器抱怨了,就用test((int)3)
  9.       test(3.0);
  10. }
复制代码
wye11083
6楼-- · 2020-01-01 03:10
xiaoergao 发表于 2017-3-5 17:06
这样是可以  但是我希望是在运行的过程中判断串口发过来的数据是否带有小数点   如果有小数点我就转换了 ...

那你可以都转成f再计算,最后加个0.1再取整。

一周热门 更多>