¿Por qué putchar no requiere un encabezado?

Al leer esta respuesta que explica el progtwig polyglot en la página que no se encuentra en Stack Overflow, me sorprendió leer que putchar was used because you don't need any #include to use it . Este parece ser el caso, aunque la referencia en.cppreference.com y la referencia putchar muestran putchar como se define en el encabezado stdio.h .

¿Cómo se puede usar una función (correctamente) sin tener una statement en C ? ¿O es putchar algo incorporado en el comstackdor (como sizeof operator)?

En c , puede utilizar cualquier función sin una statement.

El comstackdor luego asume que la función tiene un tipo de retorno de int. Los parámetros se pasan a la función como se indica. Como no hay una statement de función, el comstackdor no puede verificar si los parámetros son correctos.

putchar no está incorporado en el comstackdor. Sin embargo, desde

La función llamada putchar (c) será equivalente a putc (c, stdout).

podría definirse como una macro, por ejemplo,

 #define putchar(c) putc(c, stdout) 

En este caso, debe incluir stdio.h para tener la definición correcta para putchar .

Algunos comstackdores hacen cosas extrañas, no estándar, como la inclusión automática de varios encabezados comunes. Es posible que el código haya sido comstackdo en uno de esos comstackdores.

De lo contrario, en el antiguo estándar C90 obsoleto, no era necesario tener un prototipo de función visible: si no lo hubiera hecho, el comstackdor comenzaría a asumir que el tipo de retorno era int. Lo que no tiene ningún sentido. Esta tontería se eliminó del lenguaje C con el estándar C99.

Entonces, la razón por la que se compiló el código fue porque usaste un comstackdor de mierda. No hay garantías de que el código compile / enlace o funcione como se predijo.

Por ejemplo:

 int main () { putchar('a'); } 

Esto se comstack con gcc y gcc -std=c90 . Pero si lo comstacks como estándar C,

gcc -std=c99 -pedantic-errors

obtendrá error: implicit declaration of function 'putchar'.