Undefined ссылка на `getline 'в c
Я изучаю использование getline в программировании на языке C и пробовал коды из 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;
}
Однако проблема заключается в том, что компилятор сохраняет возвращаемые ошибки: undefined ссылка на 'getline'.
Не могли бы вы рассказать мне, в чем проблема? Спасибо!
Я использую Win7 64bit + Eclipse Indigo + MinGW
Ответы
Ответ 1
Другие ответы покрыли большую часть этого, но есть несколько проблем. Во-первых, 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).
С внесенными изменениями ваша программа компилируется и работает отлично в моей системе.
Ответ 2
getline
не является стандартной функцией, вам нужно установить макрос проверки функций, чтобы использовать его, согласно моей странице man,
_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700
для glibc 2.10 или новее,
_GNU_SOURCE
до этого.
Ответ 3
Я также использую MinGW. Я проверил заголовки MinGW и getline()
не появляется ни в одном из заголовков C, он появляется только в заголовках С++. Это означает, что функция C getline()
не существует в MinGW.
Ответ 4
Для меня компилятор говорит
getline.cpp: В функции 'int main (int, char *): getline.cpp: 15: 52: error: невозможно преобразовать 'int to' size_t * {aka long unsigned int *} для аргумента '2' '__ssize_t getline (char **, size_t *, FILE *)
Проверьте свой компилятор, компоновщик, папку с библиотекой. Может быть, переустановить?
Напишите свою собственную функцию readline. Это просто. Прочитайте char на char, пока не получите новую строку