函数指针中的警告作为另一个函数的参数

时间:2018-05-24 08:19:00

标签: c

尝试将函数指针作为参数。代码执行正确,但抛出一些警告。无法理解战争。可以在这里得到一些帮助。

#include<stdio.h>
#include<string.h>

int concat(char *str1, char *str2, char *(*cat_fun) (const char *, const char *))
{
   char str;

   if(cat_fun) {
       printf("%s\n",cat_fun (str1,str2));
       return 0;
   } else {
        return 1;
   }
}

int main(void)
{
    char str1[20] = "super ";
    char str2[] = "computer";

    concat(str1,str2,strcat);
    return 0;
}

编译:

 gcc tttt.c    
tttt.c: In function ‘main’:    
tttt.c:22:2: warning: passing argument 3 of ‘concat’ from incompatible pointer type [enabled by default]    
  concat(str1,str2,strcat);    
  ^
tttt.c:4:5: note: expected ‘char * (*)(const char *, const char *)’ but argument is of type ‘char * (*)(char * __restrict__,  const char * __restrict__)’    
 int concat(char *str1, char *str2, char *(*cat_fun) (const char *, const char *))
     ^

2 个答案:

答案 0 :(得分:1)

这是strcat

的声明
char *strcat(char *dest, const char *src);

第一个参数不是const指针,因为该函数应该修改该缓冲区。但是你的函数指针接受第一个参数作为指向const缓冲区的指针,这是一个不会被修改的指针。当然,这是语义上的不兼容性。

严格地说,C类型系统不允许隐式地将strcat转换为您指定的指针类型。但编译器可能会为了向后兼容旧C版本而接受它,并且只发出警告。在构建中提高标准合规性级别可以帮助将其转化为错误(因此,可能会阻止令人讨厌的错误)。

答案 1 :(得分:0)

第一个参数是char*,而不是const char*

见这里:

https://www.tutorialspoint.com/c_standard_library/c_function_strcat.htm