Eri*_*man 15 c reference undefined getline mingw32
我正在学习在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;
}
Run Code Online (Sandbox Code Playgroud)
但是,问题是编译器不断返回错误:未定义的引用'getline'.你能告诉我问题是什么吗?谢谢!
我使用的是Win7 64bit + Eclipse Indigo + MinGW
ama*_*rea 11
其他答案涵盖了大部分内容,但存在一些问题.首先,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*而不是a size_t*可能会产生严重的后果(并且也不能使用默认的gcc设置进行编译).有关详细信息,请参阅getline手册页(http://linux.die.net/man/3/getline).
通过更改,您的程序可以在我的系统上编译并运行正常.
getline 不是标准功能,根据我的手册页,您需要设置一个功能测试宏才能使用它,
_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700
Run Code Online (Sandbox Code Playgroud)
对于glibc 2.10或更高版本,
_GNU_SOURCE
Run Code Online (Sandbox Code Playgroud)
在那之前。