警告:在将功能地址分配给功能指针时,从不兼容的指针类型[默认启用]进行分配

sAm*_*sAm 4 c pointers function-pointers function

我试图使用函数指针实现一个简单的交换函数,但是当我将函数的地址分配给函数指针时pointersTofunctionB.c:14:6:warning: assignment from incompatible pointer type [enabled by default].以下是我的代码

#include <stdio.h>
void intSwap(int *a,int *b);
void charSwap(char *a,char *b);
void (*swap)(void*,void*);
int main(int argc, char const *argv[])
{
    int a=20,b=15;
    char c='j',d='H';
    swap=&intSwap;// warning here
    swap(&a,&b);
    printf("%d %d\n",a,b);
    swap=&charSwap;// warning here also
    swap(&c,&d);
    printf("%c %c\n",c,d ); 
    return 0;
}


void intSwap(int *a,int *b)
{
    *a=*a+*b;
    *b=*a-*b;
    *a=*a-*b;
}
void charSwap(char *a,char *b)
{
    char temp;
    temp=*a;
    *a=*b;
    *b=temp;
}
Run Code Online (Sandbox Code Playgroud)

如何删除此警告.有人帮我这个.

Vla*_*cow 10

出现警告的原因是C标准的以下引用

6.3.2.3指针

8指向一种类型的函数的指针可以转换为指向另一种类型的函数的指针,然后再返回; 结果应该等于原始指针.如果转换的指针用于调用类型与引用类型不兼容的函数,则行为未定义.

这两个函数兼容,它们的参数应具有兼容的类型

6.7.6.3函数声明符(包括原型)

15对于兼容的两种功能类型,两者都应指定兼容的返回类型.146)此外,参数类型列表(如果两者都存在)应在参数数量和省略号终止符的使用中一致; 相应的参数应具有兼容的类型.

在您的函数中,参数被声明为指针.为了使它们(指针)兼容,它们应该是兼容类型的指针

6.7.6.1指针声明符

2要使两个指针类型兼容,两者应具有相同的限定条件,并且两者都应是兼容类型的指针.

但是,一方面类型为int或char,另一方面类型为void,则不兼容类型.

您可以通过以下方式定义功能

void intSwap( void *a, void *b )
{
    int *x = a;
    int *y = b;

    *x = *x + *y;
    *y = *x - *y;
    *x = *x - *y;
}

void charSwap( void *a, void *b )
{
    char *c1 = a;
    char *c2 = b;
    char temp = *c1;

    *c1 = *c2;
    *c2 = temp;
}
Run Code Online (Sandbox Code Playgroud)