【问题标题】:How to solve a conflicting types error in c?如何解决c中的冲突类型错误?
【发布时间】:2019-09-15 14:24:01
【问题描述】:

我收到函数 getline 中类型冲突的错误。我在两个函数声明语句中的变量和函数类型都是一致的,所以不知道是什么问题。

#include <stdio.h>

int getline(char line[]);

int main()
{
   char line[100];
   int len;
   while ((len = getline(line)) > 0)
       printf("%d\n", len);
}

int getline(char line[])
{
   int i, c;
   for (i = 0; (c = getchar())!=EOF && c!='\n'; ++i)
        line[i] = c;
   if (c == '\n'){
        line[i] = c;
        ++i;
   }
   line[i] = '\0';
   return(i);
}

【问题讨论】:

  • getline() 已经是标准库函数了..为什么必须使用相同的名称?
  • How to solve a conflicting types error in c? 更改类型名称。
  • 编译器有没有告诉你函数最初在哪里声明了不同的类型?如果这不是您自己的声明,那么这是一个很好的提示,表明您正在重用现有的标识符并且应该更改名称。
  • @SouravGhosh getline 是一个非标准库函数。
  • @Lundin 对,我已将其添加到我的答案中。

标签: c getline


【解决方案1】:

您的编译器似乎配置为使用 POSIX 标准,并且在 POSIX 环境中,getline() 已经在 stdio.h 中进行原型化

ssize_t getline(char **lineptr, size_t *n, FILE *stream);

这与您的声明/定义冲突。

使用不同的函数名称(例如:my_getline() 或类似名称)。

【讨论】:

  • 我不知道“getline”已经是 POSIX 中的一个函数。我更改了名称,它解决了所有问题。非常感谢!
【解决方案2】:

您的代码使用符合标准的编译器编译得很好。

问题在于您的编译器被设置为不符合标准的编译器(它遵循 POSIX 而不是 C)。因此,您会在 POSIX 放置在 stdio.h 中的非标准函数 getline 之间发生命名空间冲突。

使用像 gcc 这样的编译器,您可以通过使用 gcc -std=c11 编译来阻止非标准扩展出现在标准头文件中。默认情况下,gcc 运行 -std=gnu11,它遵循 POSIX 而不是 C 标准。

如果您是学习 C 的初学者,请始终使用 gcc -std=c11 -pedantic-errors -Wall -Wextra 进行编译。

【讨论】:

  • 我将从现在开始添加这些选项,因为我是 C 新手!谢谢你的详细解释!
【解决方案3】:

您可以将 getline 函数名称更改为 fetchline,一切都会按预期工作。感谢 Lundin 的详尽解释。

【讨论】:

    猜你喜欢
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 2013-04-24
    相关资源
    最近更新 更多