首页 > 解决方案 > C语言模块中未定义的符号'_getline'

问题描述

#include <stdio.h>
#define MAXLINE 100

/* rudimentary calculator */
main() {
  double sum, atof(char []);
  char line[MAXLINE];
  int getline(char line[], int max);

  sum = 0;
  while(getline(line, MAXLINE) > 0)
      printf("\t%g\n", sum += atof(line));
  return 0;
}

我正在学习 Ritchie & Kernighan C Programming 手册中的 C 代码。

我正在使用 borland turbo c 编译器。

该代码用于制作一个基本的计算器。

我收到 链接器错误:模块中未定义符号“_getline”

标签: clinker

解决方案


您需要为getline().

只有一个函数声明/原型

int getline(char line[], int max);

在你的程序中getline(),但没有函数定义。


关于 K&R 的问题,在使用基本计算器进行练习之前,您错过了前第 4.1 章“函数基础”中的以下内容:

“如何编译和加载驻留在多个源文件上的 C 程序的机制因系统而异。例​​如,在 UNIX 系统上,第 1 章中提到的 cc 命令就可以完成这项工作。假设这三个函数存储在三个文件中,分别称为 main.c、getline.c 和 strindex.c。然后命令

cc main.c getline.c str index.c

编译三个文件..."

资料来源:C 编程语言(1. 版),第 61 页

“还有一个稍有不同的 getline 版本;您可能会发现将它与第 1 章中的版本进行比较会很有启发性”

资料来源:C 编程语言(1. 版本),第 60 页

int getline (char s[], int lim)   
{       
    int c, i;       
    i = 0;       

    while (--lim > 0 && (c=getchar()) != EOF && c != '\n')           
       s[i++] = c;       

    if (c == '\n')           
       s[i++] = c;       

    s[i] = '\0';       

    return i;   
}

该示例需要,

  1. 您在编译器调用时从第 1 章链接getline.c(使用 的函数定义),或者getline()
  2. getline()您在之前的程序示例之一 (页 60) 中使用了不同的定义。

旁注:

  • 请切换到最新且符合标准的编译器,例如带有MingW for Windows 的 gcc,如果您不被迫为一个类做不同的事情。

    Turbo C 非常古老,我认为它甚至不符合 ANSI C (C89/C90)。

  • 我一直在寻找“The C Programming Language”的“第二版”,但在第 61-62 页找不到您引用的示例。

    请考虑获取本书第二版的副本。它符合 ANSI C 并包含重要更新。

    您可以在此处获取它的 PDF 。

  • 关于第 1 点和第 2 点,main()也不再符合实际的 C 标准。应该是int main (void)

  • getline()请注意,在某些实现中存在同名的 POSIX 函数。如果此函数包含在您的实现中(但似乎没有),您可能会收到错误,因为这两个函数(POSIX 和 K&R 之一)具有不同的原型,然后您将尝试重新定义 POSIXgetline()函数。


推荐阅读