我正在学习在 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
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)。
做出更改后,您的程序可以在我的系统上正常编译和运行。
我也在用MinGW。我检查了 MinGW 头文件,
getline()
没有出现在任何 C 头文件中,它只出现在 C++ 头文件中。这意味着 C 函数getline()
在 MinGW 中不存在。
getline
不是标准功能,根据我的手册页,您需要设置功能测试宏才能使用它,
_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700
对于 glibc 2.10 或更高版本,
_GNU_SOURCE
在那之前
getline()
不在 C 标准库中。但是,您仍然可以将它与编译器标志 -std=gnu99
一起使用。这个标志,告诉编译器使用 ISO C99 的 GNU 方言,由 gcc
和 clang
支持
gcc main.c -std=gnu99
见 gcc flags.