-4

为什么这段代码:

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
4

3 回答 3

3

因为编译器在调用它时不知道它的定义myfunction()。然后编译器假定它返回一个 int ... 并给出该消息。

解决方案:在调用之前为函数提供一个原型(或其定义,作为原型)。

于 2013-05-09T18:34:05.553 回答
2

为了建立约翰的答案,大多数 C 编译器将允许您调用编译器尚不知道的函数。这允许您将函数的实现与调用站点分开,希望它允许增量构建,并允许您使用来自外部源的函数。

在这种情况下,编译器假定函数返回一个int,并且所有参数都是类型int,因为没有为编译器提供函数原型(在文件中的任何函数之外或在头文件中)。编译器做出此假设的原因是历史性的,并且基于K&R C的发展

如果您打开严格的 ansi 模式 ( -std=c99 -pedanticfor gcc),文件将无法编译,因为在不知道参数类型的情况下调用函数通常被认为是一个坏主意。

这就是您收到警告的原因。

您应该将以下内容放在源文件的顶部:

char *myfunction(int p);

请注意,该行末尾的分号告诉编译器这是一个函数原型而不是实现——编译器假设它来自其他一些翻译单元。

于 2013-05-09T18:42:58.243 回答
2

你有调用上面的原型吗?该函数应该在使用之前进行原型设计或定义。否则编译器将假定它的默认返回类型为int.

// Prototype
char *myfunction(int p);

int main()
{
    // Use
    strcmp(myfunction(0), "OK");
}

// Definition
char *myfunction(int p)
{
    ...
}
于 2013-05-09T18:33:29.240 回答