20

我正在学习在 C 编程中使用 getline 并尝试了来自http://crasseux.com/books/ctutorial/getline.html的代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int atgc, char *argv[])
{
    int bytes_read = 1;
    int nbytes = 10;
    char *my_string;

    my_string = (char *)malloc(nbytes+1);

    puts("Please enter a line of text");

    bytes_read = getline(&my_string, &nbytes, stdin);

    if (bytes_read == -1)
    {
        puts ("ERROR!");
    }
    else
    {
        puts ("You typed:");
        puts (my_string);
    }

    return 0;
 }

但是,问题在于编译器不断返回 this: undefined reference to 'getline' 的错误。你能告诉我问题是什么吗?谢谢!

我正在使用 Win7 64bit + Eclipse Indigo + MinGW

4

3 回答 3

18

其他答案已经涵盖了大部分内容,但存在几个问题。首先,getline()不在 C 标准库中,而是 POSIX 2008 扩展。通常,它可以与 POSIX 兼容的编译器一起使用,因为宏 _POSIX_C_SOURCE 将使用适当的值定义。您可能有一个以前getline()标准化的旧编译器,在这种情况下,这是一个 GNU 扩展,您必须#define _GNU_SOURCE#include <stdio.h>启用它,并且必须使用与 GNU 兼容的编译器,例如 gcc。

此外,nbytes应该有 type size_t,而不是int。至少在我的系统上,它们的大小不同,size_t更长,并且使用 aint*而不是 asize_t*可能会产生严重后果(并且也不能使用默认的 gcc 设置进行编译)。有关详细信息,请参阅 getline 手册页 (http://linux.die.net/man/3/getline)。

进行该更改后,您的程序可以在我的系统上编译并正常运行。

于 2012-10-28T22:53:22.467 回答
9

我也在使用 MinGW。我检查了 MinGW 头文件并getline()没有出现在任何 C 头文件中,它只出现在 C++ 头文件中。这意味着getline()MinGW 中不存在 C 函数。

于 2016-03-17T16:39:39.997 回答
7

getline不是标准功能,根据我的手册页,您需要设置一个功能测试宏才能使用它,

_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700

对于 glibc 2.10 或更高版本,

_GNU_SOURCE

在那之前。

于 2012-10-28T20:43:48.627 回答