尽管导入stdio,但getline未在此范围内声明

我需要在C中使用getline() ,但是当我写:

 #define _GNU_SOURCE #include  #include  #include  int main(int argc, char** argv) { char *line; getline(&line, NULL, stdin); free(line); return (0); } 

编译器写入error: getline was not declared in this scope我该怎么办? getdline是不是在stdio.h被推迟了? 我之前从未遇到过这种问题。

我使用GCC GNU编译器。

您需要定义_GNU_SOURCE以使用此函数,在包含stdio.h之前定义它或将其作为-D_GNU_SOURCE传递给编译,因为这是GNU扩展函数。

另一个可能的原因是你的GLIBC没有这个function,所以要么尝试:

  • /usr/include/stdio.h使用它

  • 测试_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700 _POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700就像手册页所说(包括features.h

以下实现可能有效(未经测试):

 #define INTIAIL_SIZE 100 size_t getline(char **lineptr, size_t *n, FILE *stream) { char c; size_t read = 0; char *tmp; if (!*lineptr) { if (!n) *n = INTIAIL_SIZE; tmp = malloc(*n); *lineptr = tmp; } else tmp = *lineptr; while ((c = fgetc(stream)) != '\n') { *tmp++ = c; if (++read >= *n) { char *r = realloc(tmp, *n * 2); if (!r) { errno = ENOMEM; return -1; } else tmp = r; } } *n = read; return read; } 

您目前的错误:

  • 你使用它之后就不会释放line

  • 你不是通过引用传递,因为函数原型是: ssize_t getline(char **lineptr, size_t *n, FILE *stream); 因此char **lineptr