¿Alguien puede explicar este comportamiento? solo 2 lineas de codigo

Por favor explique este fragmento de código:

#include  int puts(const char *str) { fputs("Hello world!\n", stdout); } int main() { printf("Goodbye\n"); } 

Salida: Hello world! regreso 13

Es específico del comstackdor. Obtienes este comportamiento con GCC . Aquí hay algunos detalles.

  • ya que #include (en realidad porque se encuentra en un entorno hospedado), el puts es el estándar C99, y redefinirlo es un comportamiento indefinido

  • El comstackdor GCC tiene algunas optimizaciones para transformar algunos printf en una secuencia de puts más rápidas . Esto es legal, ya que ha incluido (y el estándar C99 define qué debería hacer printf en ese caso; GCC pasa por __builtin_printf como un paso intermedio)

Si comstacks con -ffreestanding no observarás eso.

Tu pregunta es muy cercana a esta ; por lo que esta respuesta también es relevante.

gcc xc -S -o- el progtwig con gcc xc -S -o- . Me dio

 [...] main: .LFB1: .cfi_startproc pushl %ebp .cfi_def_cfa_offset 8 .cfi_offset 5, -8 movl %esp, %ebp .cfi_def_cfa_register 5 andl $-16, %esp subl $16, %esp movl $.LC1, (%esp) call puts leave .cfi_restre 5 .cfi_def_cfa 4, 4 ret .cfi_endproc .LFE1: 

por lo tanto, de hecho, la llamada a printf se reemplaza con puts en GCC, ya que tienen la misma semántica.

Mi conjetura sería que el comstackdor cambia la llamada a printf() en una llamada a puts() , ya que no hay necesidad de printf() debido a que no hay formato. También la cadena termina con una nueva línea, que se ajusta a puts() . El comstackdor no vio venir la sobrecarga de una función de biblioteca, por lo que se “engañó”.