Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

137
Vistas
¿Cómo es que puedo anular printf en lenguaje C?

Considere la siguiente pieza de código:

 #include <stdio.h> #include <stdlib.h> #include <stdarg.h> int printf(const char *format, ...) { va_list args; return 1; } int main() { printf("Hello there"); return 0; }

Y, de hecho, printf no imprime nada. Es decir, el compilador 'prefiere' esta función sobre la declarada en <stdio.h> . Pero C no permite la anulación de funciones y, según tengo entendido, debería arrojar un error de errores en conflicto.

¿Alguien puede explicar este comportamiento?

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

El estándar C dice ( 7.1.3 Identificadores reservados ):

  • Todos los identificadores con enlace externo en cualquiera de las siguientes subcláusulas (incluidas las futuras instrucciones de la biblioteca) y errno siempre se reservan para su uso como identificadores con enlace externo.
  • Cada identificador con alcance de archivo enumerado en cualquiera de las siguientes subcláusulas (incluidas las futuras instrucciones de la biblioteca) está reservado para su uso como nombre de macro y como identificador con alcance de archivo en el mismo espacio de nombres si se incluye alguno de sus encabezados asociados.
  • Si el programa declara o define un identificador en un contexto en el que está reservado (aparte de lo permitido por 7.1.4), o define un identificador reservado como un nombre de macro, el comportamiento es indefinido .

Entonces, cuando se incluye <stdio.h> , printf se reserva como un identificador con alcance de archivo en el espacio de nombres de los identificadores ordinarios. Además, printf siempre se reserva como un identificador con enlace externo, incluso si <stdio.h> no está incluido.

7.1.4 El uso de funciones de biblioteca no permite definir una función con un nombre reservado.

En la mayoría de las implementaciones, dicha definición reemplazará silenciosamente la función de biblioteca, pero el estándar no garantiza nada.

over 4 years ago · Santiago Trujillo Denunciar

0

No se puede compilar por MSVC.

https://godbolt.org/z/Y1o14jj39

La respuesta es que en Linux el enlazador intentará usar su función local primero, y solo entonces buscará la función dentro de las bibliotecas del sistema, y eso no es un error por varias razones históricas.

Y sí, printf se puede definir dentro de varias bibliotecas, la última biblioteca cargada tendrá prioridad. ¡Esta es una característica! Puede anular cualquier llamada al sistema configurando la variable de entorno LD_PRELOAD en la ruta de su propia biblioteca compartida con esa llamada al sistema.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda