Concetti Chiave

  • Le funzioni variadiche in C consentono di utilizzare un numero variabile di argomenti, dichiarate con la sintassi delle elissi.
  • È necessario stabilire convenzioni per specificare il numero e il tipo di argomenti, utilizzando argomenti fissi o valori speciali come sentinelle.
  • Per accedere agli argomenti opzionali, si utilizzano macro della libreria stdarg.h, come va_start e va_arg, per gestire i dati in modo efficiente.
  • Le promozioni di default determinano i tipi dei parametri: gli interi diventano int e i tipi in virgola mobile diventano double, influenzando l'uso di va_arg.
  • Definire funzioni con argomenti di tipo diverso è complicato, richiedendo attenzione alle convenzioni e alle promozioni di tipo.

Funzioni variadiche = funzioni con un numero variabile di argomenti. Lo standard di C ha una sintassi specifica per la dichiarazione di queste funzioni, ma non ha alcuna sintassi apposita per la loro definizione, è quindi necessario usare macro e funzioni della libreria stdarg.h.

Sintassi e convenzioni delle funzioni variadiche

I prototipi delle funzioni variadiche usano le elissi:

(, …)

In ogni funzione variadica c’è almeno un elemento fisso, il primo, ma possono essercene anche di più, ma l’elissi rimane comunque l’ultimo argomento.

In C non è possibile determinare il numero e il tipo di argomenti di una chiamata di funzione, quindi il programmatore deve definire convenzioni che il chiamante adotta per specificare il numero e il tipo di argomenti:

- si può usare uno degli argomenti fissi per specificare il numero di argomenti con cui la funzione viene chiamata, ma può essere applicata solo se gli argomenti sono tutti dello stesso tipo

- si può usare un valore speciale (sentinella) come ultimo argomento, applicabile solo se gli argomenti opzionali sono dello stesso tipo

- si può usare uno degli argomenti fissi come pattern, il quale esprime tipo e numero di argomenti opzionali (es. specificatori di formato)

Accesso agli argomenti opzionali

Nelle funzioni variadiche gli argomenti fissi hanno nome mentre quelli opzionali no. Per accedere a questi argomenti e necessario perciò usare macro parametriche definite nella libreria stdarg.h, e per accedervi:

- si inizializza un puntatore, di tipo va_list usando la macro va_start, passando a va_start il nome dell’ultimo argomento fisso della funzione

- si accede agli argomenti usando la macro va_arg, in cui è necessario specificare il tipo di dato, la prima invocazione accede al primo argomento opzionale, la seconda al secondo

- si termina l’uso della variabile di tipo va_list con la macro va_end

Quindi è possibile accedere agli argomenti opzionali illimitatamente, usando diverse variabili

di tipo di va_list, inizializzando ognuna con la macro va_start.

Considerazioni sulle promozioni di default

Non ci sono indicazioni sui tipi usati per gli argomenti opzionali, quindi ci sono le promozioni di default: gli interi sono int, i tipi in virgola mobile sono double, quindi va_arg(ap, float) non è corretta, perche provoca un comportamento non definito.

Considerazione generale: è complicato definire funzioni con argomenti di tipo diverso.

Domande da interrogazione

  1. Qual è la sintassi per dichiarare una funzione variadica in C?
  2. Le funzioni variadiche in C utilizzano le elissi nella loro dichiarazione, rappresentate da "…", e devono avere almeno un argomento fisso, mentre l'elissi deve essere l'ultimo argomento (come indicato nel testo).

  3. Come si accede agli argomenti opzionali in una funzione variadica?
  4. Per accedere agli argomenti opzionali, si deve inizializzare un puntatore di tipo va_list con la macro va_start, quindi utilizzare la macro va_arg per accedere agli argomenti, e infine terminare l'uso con va_end (come descritto nel testo).

  5. Quali sono le considerazioni sulle promozioni di default per gli argomenti opzionali?
  6. Non essendoci indicazioni sui tipi degli argomenti opzionali, gli interi sono promossi a int e i tipi in virgola mobile a double; pertanto, l'uso di va_arg con float è errato e provoca un comportamento non definito (come evidenziato nel testo).

Domande e risposte

Hai bisogno di aiuto?
Chiedi alla community