c - 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”
解决方案
您需要为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 章链接
getline.c
(使用 的函数定义),或者getline()
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()
函数。
推荐阅读
- php - 如何链接到页面的特定部分 HTML PHP
- c# - 当后端代码中的简单键值变量工作相同时,为什么要使用 redis 作为缓存层?
- google-apps-script - Google Slides Apps 脚本检索页面中的形状
- python-3.x - 在 KNeighborsClassifier 中使用自定义指标时,我不断收到“TypeError:只有整数标量数组可以转换为标量索引”
- java - JavaFX - 在使用选项卡时将 GUI 拆分为单独的类
- jquery - 通过函数调整电子窗口大小
- scheme - 匹配方案中的括号
- android - 当我使用 adb 显示 /sys/kernel/debug/tracing/available_filter_functions 时没有这样的设备
- python - 初始化以迭代抽象pyomo模型中的集合?
- angular-cli - 运行 ng serve -o 时出现错误