Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

250
Visualizações
¿Cómo puede sem_open() aceptar diferentes tamaños de argumento si la sobrecarga de funciones no es compatible con C?

Mientras aprendía sobre los semáforos de procesos compartidos, noté que sem_open() presenta dos prototipos de funciones: https://man7.org/linux/man-pages/man3/sem_open.3.html

 sem_t *sem_open(const char *name, int oflag); sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value);

¿Cómo es esto posible si C no admite la sobrecarga de funciones?

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

C no tiene sobrecarga. Lo que sí tiene son funciones variádicas.

Las funciones sobrecargadas son funciones que tienen múltiples formas de la función con diferentes argumentos para cada una.

Las funciones variádicas son funciones en C que pueden tomar un número variable de argumentos. Esto se indica con puntos suspensivos (...), y aunque esto no es evidente en la página del manual, si observa el código fuente de sem_open() puede verlo:

 /* Open a named semaphore NAME with open flags OFLAG. */ extern sem_t *sem_open (const char *__name, int __oflag, ...) __THROW;

Como puede ver, después de __name y __oflag, los puntos suspensivos indican que técnicamente se puede ingresar cualquier número de argumentos. Pero lo que indica la página de manual es qué variables sem_open() realmente puede manejar. Entonces, en realidad, no se trata de dos funciones con una lógica diferente, sino de una sola función que puede manejar dos conjuntos diferentes de argumentos.

Si desea saber más, existe este interesante artículo que cubre parte de la historia detrás de las funciones variádicas.

over 4 years ago · Santiago Trujillo Relatório

0

La clave se encuentra en la página de manual (que vinculó):

Si se especifica O_CREAT en oflag , se deben proporcionar dos argumentos adicionales.

Esa es exactamente la forma en que funcionan las funciones variadicas en C. Una función variadica tiene un número fijo de parámetros, cada uno con un tipo bien definido, y luego un ... , que puede ser cualquier número de argumentos de cualquier tipo, con la condición de que la función llamada tiene que ser capaz de averiguar el tipo de cada argumento para hacer referencia a él. printf es de hecho el ejemplo más claro: la cadena de formato incluye suficiente información para que printf sepa exactamente cuántos y qué tipo de argumentos esperar.

Tenga en cuenta que no se permite adivinar. Si la función solicita un argumento que no se proporcionó o solicita un tipo diferente al argumento proporcionado, no obtiene una indicación de error amigable o una segunda oportunidad. El resultado es un comportamiento indefinido: puede pasar cualquier cosa, incluida la terminación abrupta o un resultado sin sentido. O un resultado que parece tener sentido pero no tiene base en la realidad.

Al igual que open , sem_open usa esto para permitir argumentos que solo son necesarios en ciertas circunstancias bien definidas. Si es posible que la llamada cree un nuevo semáforo (o archivo, en el caso de open ), solicitará los argumentos adicionales, suponiendo que sean de los tipos especificados en la documentación.

La persona que llama es responsable de asegurarse de que la llamada sea correcta. Tenga en cuenta que dado que los argumentos variádicos no tienen un tipo declarado, el compilador no puede insertar conversiones de tipo. Entonces, si la función espera un double , no se puede llamar con un int , lo que normalmente sería posible. Además, si se supone que un argumento variádico es void* , debe ser void* , y no, por ejemplo, 0 (o NULL ), porque no se puede realizar la conversión automática de 0 a un puntero nulo.

Sin embargo, la persona que llama puede proporcionar demasiados argumentos o, por el contrario, no se requiere que la función llamada examine todos los argumentos proporcionados. (No puede omitir argumentos, pero no necesita llegar al final de la lista).

En retrospectiva, esto puede parecer una característica terrible del lenguaje. Pero parecía una buena idea en ese momento, y no va a desaparecer ahora.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda