typedef char bool;
and then maybe they use it like so: bool found_it = strstr(haystack, needle);
This has a serious bug that will only manifest 0.4% of the time. The problem is that strstr returns a pointer, and converting a pointer to a smaller integer type throws away the high bytes. If the resulting pointer is not NULL but happens to have a zero low byte, this bool will be false, even though the string was found.Even if that doesn't happen, you'll often see code like this:
#define true 1
...
if (found_it == true) ...
which is wrong as well.bool addresses these. Conversions to bool always result in values of 0 or 1, so both of the above problems are avoided.
That said, I agree with Linus. It's not well understood, and using bool in a library header may conflict with another definition of bool in the project. Also, compilers typically warn about at least the first error above. As a C99 feature, bool is too little, too late; had it been part of C89, things might be different.