【发布时间】:2015-07-23 08:30:21
【问题描述】:
我写了这个简单的字符串比较代码
#include<stdio.h>
void strCmp(char *,char *);
int main() {
char* str1 = "hello";
char* str2 = "hello";
strCmp(str1,str2);
return 0;
}
void strCmp(char *vp1,char *vp2) {
int r = strcmp(vp1,vp2);
printf("result %d",r);
}
然后为了检查如果我传递 void* 而不是 char* 会发生什么,我重写了如下代码:
#include<stdio.h>
void strCmp(void *,void *);
int main() {
char* str1 = "hello";
char* str2 = "hello";
strCmp(str1,str2);
return 0;
}
void strCmp(void *vp1,void *vp2) {
int r = strcmp(vp1,vp2);
printf("result %d",r);
}
上面的代码被编译并按预期工作!如果我更疯狂地去做
#include<stdio.h>
void strCmp(void **,void **);
int main() {
char** str1 = "helloxx";
char** str2 = "hellox";
strCmp(str1,str2);
return 0;
}
void strCmp(void **vp1,void **vp2) {
int r = strcmp(vp1,vp2);
printf("result %d",r);
}
没有失败,结果很好。我想知道 strcmp 的实现是什么,并将 https://stackoverflow.com/a/10927187/2304258 中的代码作为自定义函数复制粘贴到我的代码中,但是当您使用 void* 而不进行强制转换时,它会失败并出现您期望的常见错误消息。
您能解释一下上述实现是如何工作的吗?
【问题讨论】:
-
这不能在 C++ 中编译。请不要标记不相关的语言。
-
查看您的具体
stdio.h。似乎strcmp那里有int(const void*, const void*)签名。 -
这就是为什么你不应该忽略编译器警告。
-
你的第三段代码是非法的。请以一致性模式调用您的编译器。
-
代码编译不干净。缺少代码:'#include
' 最后一个示例由于语法错误而无法编译