为什么这段代码:
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
因为编译器在调用它时不知道它的定义myfunction()
。然后编译器假定它返回一个 int ... 并给出该消息。
解决方案:在调用之前为函数提供一个原型(或其定义,作为原型)。
为了建立约翰的答案,大多数 C 编译器将允许您调用编译器尚不知道的函数。这允许您将函数的实现与调用站点分开,希望它允许增量构建,并允许您使用来自外部源的函数。
在这种情况下,编译器假定函数返回一个int
,并且所有参数都是类型int
,因为没有为编译器提供函数原型(在文件中的任何函数之外或在头文件中)。编译器做出此假设的原因是历史性的,并且基于K&R C的发展
如果您打开严格的 ansi 模式 ( -std=c99 -pedantic
for gcc
),文件将无法编译,因为在不知道参数类型的情况下调用函数通常被认为是一个坏主意。
这就是您收到警告的原因。
您应该将以下内容放在源文件的顶部:
char *myfunction(int p);
请注意,该行末尾的分号告诉编译器这是一个函数原型而不是实现——编译器假设它来自其他一些翻译单元。
你有调用上面的原型吗?该函数应该在使用之前进行原型设计或定义。否则编译器将假定它的默认返回类型为int
.
// Prototype
char *myfunction(int p);
int main()
{
// Use
strcmp(myfunction(0), "OK");
}
// Definition
char *myfunction(int p)
{
...
}