为什么这段代码:
strcmp(myfunction(0), "OK");
其中myfunction定义如下:
char *myfunction(int p)
{
if (p == 0)
{
return("OK");
}
}
给出以下错误:
warning: passing argument 1 of 'strcmp' makes pointer from integer without a cast
答案 0 :(得分:3)
因为编译器在调用它时不知道myfunction()
的定义。
然后编译器假定它返回一个int ...并给出该消息。
解决方案:在调用之前为函数(或其定义,作为原型)提供原型。
答案 1 :(得分:2)
你有一个原型吗?该函数应该是原型,或者在使用之前定义。否则,编译器将假定它具有默认返回类型int
。
// Prototype
char *myfunction(int p);
int main()
{
// Use
strcmp(myfunction(0), "OK");
}
// Definition
char *myfunction(int p)
{
...
}
答案 2 :(得分:2)
基于John的答案,大多数C编译器将允许您调用编译器尚不知道的函数。这允许您将函数的实现与调用站点分开,希望它允许增量构建,并允许您使用外部源的函数。
在这种情况下,编译器假定函数返回int
,并且所有参数都是int
类型,因为编译器尚未提供函数原型(在文件中的任何函数之外或在头文件中)。编译器进行此假设的原因是历史的,并且基于K&R C
如果打开严格的ansi模式(-std=c99 -pedantic
为gcc
),文件将无法编译,因为在不知道参数类型的情况下调用函数通常被认为是个坏主意。
这就是你收到警告的原因。
您应该将以下内容放在源文件的顶部:
char *myfunction(int p);
注意该行末尾的分号告诉编译器这是一个函数 prototype 而不是实现 - 编译器假设来自其他一些翻译单位。