【问题标题】:C compare string literal with function returning char pointerC将字符串文字与返回char指针的函数进行比较
【发布时间】:2013-05-09 18:31:33
【问题描述】:

为什么会有这段代码:

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() 是在你调用它之前声明的吗?
  • 您在调用它之前忘记声明myfunction。这已经被问了数百万次了。根据您的错误消息进行搜索会为同一问题提供大量答案。

标签: c string pointers cstring


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    // Prototype
    char *myfunction(int p);
    
    int main()
    {
        // Use
        strcmp(myfunction(0), "OK");
    }
    
    // Definition
    char *myfunction(int p)
    {
        ...
    }
    

    【讨论】:

    • 太好了,这行得通!我认为这是一个指针问题......所以我开始随机应用 * 和 &。应该先来这里!
    【解决方案3】:

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

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

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

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

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

    char *myfunction(int p);

    note 行尾的分号告诉编译器这是一个函数 prototype 而不是 implementation - 编译器假定来自其他翻译单位。

    【讨论】:

    • 很好的解释,但我有一点不同意。虽然隐式 int 确实不再是标准的一部分,但您似乎在暗示未指定的参数列表也不是。如果是这样,(不幸的是)情况并非如此。它已被弃用但未被禁止。有关示例,请参阅 C11 规范的第 6.11.6 节和ideone.com/eTOS5V。如果我误解了你,我深表歉意。
    • @jerry 是的,该示例在严格的 ANSI 模式下编译而没有警告。标准机构一直在做什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 2022-11-03
    相关资源
    最近更新 更多