尝试将函数指针作为参数。代码执行正确,但抛出一些警告。无法理解战争。可以在这里得到一些帮助。
#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 *))
^
答案 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