为什么这个 getline 的 return 值测试会导致无限循环?

Why does this test of getline's return value result in an infinite loop?

以下程序应该读取特定的文本文件并逐行打印其内容。但是,它会导致无限循环。为什么?

#define __STDC_WANT_LIB_EXT2__ 1
#include <stdio.h>

int main(void)
{
    char *line = NULL;
    size_t buf_len;
    size_t line_len;

    FILE *fp = fopen("README.txt", "r");

    while (1) {
        line_len = getline(&line, &buf_len, fp);
        if (line_len < 0)
            break;
        printf("%s", line);
    }

    return 0;
}

我注意到我可以通过将 line_len < 0 更改为 line_len == -1 来解决问题,但我不明白为什么这样可以解决问题。 -1不小于0吗?

(C 编译器:Ubuntu 20.04 上的 gcc 9.4.0)。

line_lensize_t 类型,应该 link 为无符号长整型,因为它是无符号值,它永远不会低于 0,而是环绕到最高可能的值。

这可能是因为 -1 没有任何类型的注释:

unsigned long test1 = 18446744073709551615;
long test2 = -1;

printf("%d\n", test1 == test2);

returns true因为位值相同

C 会进行一些类型转换(例如 10.0f == 10),但如果值是内联的,它无法知道您需要它是什么类型。