标签:
在网上看到这道题,编写程序如下:
代码1:
char *cpystr(char *des,const char *src)
{
int i = 0;
if (NULL == des || NULL == src)
return NULL;
while (src[i] != ‘\0‘)
{
des[i] = src[i];
i++;
}
return des;
}
1.这样写可以实现复制功能,只是C/C++语法有一个漏洞,支持const char*向char *的默认转换,如果调用
cpystr()时这样写:cpystr("hello","hello");可以编译通过(在VS2013下测试)。运行会发生段错误。
为避免这个错误,可以定义一个函数如下:、
char *cpystr(const char *des,const char *src)
{
printf("error:the first arg can‘t be const\n");
exit(0);
}
如果知识声明char *cpystr(const char *des,const char *src);而不对该函数进行定义,会发生错误,
“ error LNK2019: 无法解析的外部符号 "char * __cdecl cpystr(char const *,char const *)" (?cpystr@@YAPADPBD0@Z),
该符号在函数 _main 中被引用。”
2.上面说的,给cpystr(char *des,const char *src)传参cpystr("hello","hello"),会将第一个参数的第一个参数const char *转换为
char *,编译可以通过。需要利用函数重载另定义一个函数cpystr(const char *des,const char *src)来解决。
代码2:
const char *a = "hello";
char *b = a;
代码2在VS2013下不能编译通过,显示error C2440: “初始化”: 无法从“const char *”转换为“char *”
3.上面的代码1和代码2写成C语言编译的结果和C++编译的结果是一样的(用gcc做的测试),可惜C语言无法进行函数重载来避免这个错误。
标签:
原文地址:http://www.cnblogs.com/gazebal/p/4489092.html