我使用下面的代码:
char dest[5];
char src[5] = "test";
printf("String: %s\n", do_something(dest, src));
char *do_something(char *dest, const char *src)
{
return dest;
}
这里的执行do_something
并不重要。当我尝试编译上述我得到这两个异常:
错误:'do_something'的冲突类型(在printf调用处) 错误:以前的'do_something'隐式声明在这里(在原型行)
为什么?
发布于 2018-04-20 13:54:12
在声明它之前试图调用do_something。需要在printf行之前添加一个函数原型:
char* do_something(char*, const char*);
或者需要将函数定义移动到printf行的上方。在声明之前不能使用函数。
发布于 2018-04-20 15:46:46
在“经典”C语言(C89 / 90)中,当你调用一个未声明的函数时,C假设它返回一个int
并且还试图从实际参数的类型中派生它的参数类型(不,它不假定它没有参数,正如有人建议)。
在你的具体示例中,编译器会查看do_something(dest, src)
调用并隐式地派生出一个声明do_something
。后者看起来如下
int do_something(char *, char *)
但是,稍后在你明确声明do_something
char *do_something(char *, const char *)
正如你所看到的,这些声明是彼此不同的。这是编译器不喜欢的。
https://stackoverflow.com/questions/-100003293
复制相似问题