c

问题描述 投票:0回答:4

我正在学习在 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;
 }

但是,问题是编译器不断返回这样的错误:未定义对“getline”的引用。 你能告诉我问题是什么吗?谢谢!

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

c reference undefined getline mingw32
4个回答
19
投票

其他答案已经涵盖了大部分,但是有几个问题。首先,

getline()
不在 C 标准库中,而是 POSIX 2008 扩展。通常,它可用于 POSIX 兼容的编译器,因为宏 _POSIX_C_SOURCE 将使用适当的值定义。你可能在
getline()
被标准化之前有一个旧的编译器,在这种情况下这是一个 GNU 扩展,你必须在
#define _GNU_SOURCE
之前使用
#include <stdio.h>
来启用它,并且必须使用 GNU 兼容的编译器,例如 gcc .

另外,

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

做出更改后,您的程序可以在我的系统上正常编译和运行。


9
投票

我也在用MinGW。我检查了 MinGW 头文件,

getline()
没有出现在任何 C 头文件中,它只出现在 C++ 头文件中。这意味着 C 函数
getline()
在 MinGW 中不存在。


7
投票

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

_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700

对于 glibc 2.10 或更高版本,

_GNU_SOURCE

在那之前


0
投票

getline()
不在 C 标准库中。但是,您仍然可以将它与编译器标志
-std=gnu99
一起使用。这个标志,告诉编译器使用 ISO C99 的 GNU 方言,由
gcc
clang

支持
gcc main.c -std=gnu99

见 gcc flags.

© www.soinside.com 2019 - 2024. All rights reserved.