getline 函数未使用 mingw-w64 gcc 编译
Posted
技术标签:
【中文标题】getline 函数未使用 mingw-w64 gcc 编译【英文标题】:getline function not compiling with mingw-w64 gcc 【发布时间】:2021-02-15 09:21:29 【问题描述】:我有一个 program2.c c 代码。 gcc program2.c 给出以下错误 -
我尝试了各种选项,例如
-
gcc -std=gnu90 program2.c
gcc -std=c90 program2.c
gcc -std=c99 program2.c
gcc -std=c11 program2.c
gcc -std=gnu11 program2.c
g++ program2.c
以上都没有编译文件。错误总是相似的。 有没有办法编译这个? 看起来 getline 不是 c 标准的一部分。但是有些编译器确实支持它。
有什么建议吗?
【问题讨论】:
你是对的,getline 不是 C 标准的一部分。这是一个 POSIX 标准函数 如果 Windows C 库有它,我会感到惊讶。 在这种情况下,我无法在 Windows 的 C 程序上使用 getline 函数。这真的很奇怪。这就像失去了很多功能。而在 linux 机器上它可以完美运行。一定有一些编译器可以让 getline 工作? 【参考方案1】:确实,getline
从来都不是 C 标准库的一部分,而是一个 Unix/POSIX 扩展。要访问它,您需要在 Unix 下以 POSIX ("gnu") 模式使用 gcc 进行编译,在这种情况下,编译器会将函数丢弃在 stdio.h 中。在标准头文件中删除非标准函数是不合规的行为。
要使其在 Windows 下运行,您需要使用 Cygwin 在 Windows 下模拟 Unix。 gcc/mingw 端口不行,因为它使用微软的 C 标准库。
好消息是,您可能无论如何都不想使用getline
(即使在 POSIX 中),因为该函数的 API 很糟糕,并且是有缺陷的 C 程序中内存泄漏的主要来源。这是应该避免的那些奇怪的、古老的 Unix 函数之一。而是考虑将fgets
与调用者分配的缓冲区一起使用:更快、更安全、可移植的标准C。
【讨论】:
我试过 cygwin。它也没有在那里工作。fgets
可能是个好主意。我试图读入一个文件。所以使用 getline 来接收可变长度的输入。此外,我将任意长度的可变行作为程序的输入。可以使用fgets
来达到同样的效果。 getline
自动分配内存。
@pensee 这取决于预期的文件格式。通常只静态分配一些 256 字节左右的临时缓冲区然后使用 fgets
就可以了。
如果我将字符串作为用户的输入怎么办。现在我不知道用户是否会输入一个包含 1000 个字符或 10000 个字符的字符串。所以事先分配缓冲区是行不通的。你也能给出一些为什么getline
的API 很差的原因。任何参考或在线链接?
@pensee 它分配人们总是忘记清理的内存这一事实是主要的。以及 size 参数的潜在问题,当它被写入而不是由函数写入时。 ssize_t、EOF 和“带内错误指示器”也存在其他问题,请参阅CERT-C ERR02-C,这在理论上可能是一个安全问题。 (但是整个 stdio.h 有或没有扩展只是一个大的安全问题开始......)
@pensee 你真的不应该接受这么长时间的使用输入。将其限制在对应用程序有意义的范围内。否则,理论上用户可能会提供大量输入以使堆溢出并导致程序崩溃,或者在最坏的情况下导致整个系统崩溃。以上是关于getline 函数未使用 mingw-w64 gcc 编译的主要内容,如果未能解决你的问题,请参考以下文章
未定义的参考链接 yaml-cpp 程序与 mingw-w64 + cmake
将 Winsock2 添加到我的 MinGW-w64 C/C++ 会导致:未定义对“InitializeConditionVariable”的引用
Python for Windows 在调用 MinGW-w64 编译库的函数时挂起
GCC (MingW-w64) 找不到基础构造函数 (!?)