Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

249
Views
¿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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!