我正在尝试使用函数指针实现一个简单的交换函数,但是当我将函数指针分配给函数指针时,我得到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;
}
如何删除此警告。有人帮我这个。
答案 0 :(得分: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;
}
答案 1 :(得分:3)
您需要更改
swap=&intSwap;
到
swap=intSwap;
同样适用于swap=&charSwap;
。
同样,您的函数签名与函数指针签名不匹配。
您的功能是
void intSwap(int *a,int *b);
返回类型为void,两个输入参数为int *
,而您的函数指针签名为
void (*swap)(void*,void*);
需要两个void *
秒。同样适用于void charSwap
函数。
要么你必须改变功能签名,要么你必须使用不同的函数指针原型。否则,行为未定义。 [正如弗拉德的回答中提到的那样]。
答案 2 :(得分:-3)
#include<stdio.h>
using namespace std;
void intSwap(int *a,int *b);
void charSwap(char *a,char *b);
void (*swap)(int*,int*);
void (*swap1)(char*,char*);
int main()
{
int a=20,b=15;
char c='j',d='H';
swap=&intSwap;// warning here
swap(&a,&b);
printf("%d %d\n",a,b);
swap1=&charSwap;// warning here also
swap1(&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;
}
**If you want you can use like it......**
答案 3 :(得分:-5)
要删除警告,请对此过载进行编码:
void (*swap)(int *,int*);
void (*swap)(char *,char*);