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

时间:2014-12-24 05:58:59

标签: c function pointers function-pointers

我正在尝试使用函数指针实现一个简单的交换函数,但是当我将函数指针分配给函数指针时,我得到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;
}

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

4 个答案:

答案 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*);