C将字符串文字与函数返回字符指针进行比较

时间:2013-05-09 18:31:33

标签: c string pointers cstring

为什么这段代码:

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

3 个答案:

答案 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 -pedanticgcc),文件将无法编译,因为在不知道参数类型的情况下调用函数通常被认为是个坏主意。

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

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

char *myfunction(int p);

注意该行末尾的分号告诉编译器这是一个函数 prototype 而不是实现 - 编译器假设来自其他一些翻译单位。