具有不同数量参数的函数指针数组

问题描述

我想用下面的代码替换下面的switch case语句

switch (n)
  {
      case 0:
            i2c_scan();
            break;
        case 1:
            i2c_read(45);
            break;
        case 2:
            i2c_write(45,5);
            break;
        default:
            printf("\nwrong input\n");
            break;
  }

请检查以下代码

#include<stdio.h>

void i2c_scan()
{
    printf("\ni2c scan\n");
}
void i2c_read(int x)
{
    x= x+1;
   printf("\ni2c read: %d\n",x); 
}
void i2c_write(int x,int y)
{
    x=x+y;
    printf("\ni2c write:%d\n",x);
}

int main() {
   int n;
   
void (*fun_ptr_arr[])() = {i2c_scan,i2c_read,i2c_write}; 
    (*fun_ptr_arr[0])(45,5);  //have put array index to show results,i could have took input from user and put it here like switch case: case number) 
    (*fun_ptr_arr[1])(45,5);
    (*fun_ptr_arr[2])(45,5);
    
}

输出:

i2c扫描

i2c读取:46

i2c写:50

当我向函数传递更多的参数时,上面的代码如何编译和运行而没有任何错误?以及它如何像i2c_read接受第一个参数并给出结果一样正常工作?

解决方法

当我向函数传递更多的参数时,上面的代码如何编译和运行而没有任何错误?

正如@DanBrezeanu威尔斯所指出的,行为是UB。
可能发生任何事情,包括 显然是“工作正常”。

,

声明

void (*fun_ptr_arr[])()

表示fun_ptr_arr是指向以下形式的函数的指针的数组:

void f() { ... }
void g() { ... }

不同:

void f(void) { ... }
void g(void) { ... }

This answer详细说明,但要点是:第二种形式是不接受任何参数的函数,而第一种形式则接受任意数量的参数。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...