X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=process.tex;h=2918deb1ee32f97121977ddab0fd9639e6445430;hb=7a714b576c5f449ab288923e33c04069c0a90af0;hp=dfb5d2bbf48922aaf9347b43e1fc4e38488d282c;hpb=193d612d40c5f81f5559ea6e11e70f6b6e51fb39;p=gapil.git diff --git a/process.tex b/process.tex index dfb5d2b..2918deb 100644 --- a/process.tex +++ b/process.tex @@ -1832,15 +1832,14 @@ sono definite delle apposite macro; la procedura da seguire è la seguente: \item Dichiarare la conclusione dell'estrazione degli argomenti invocando la macro \macro{va\_end}. \end{enumerate*} + In generale è perfettamente legittimo richiedere meno argomenti di quelli che potrebbero essere stati effettivamente forniti, e nella esecuzione delle \macro{va\_arg} ci si può fermare in qualunque momento ed i restanti argomenti saranno ignorati; se invece si richiedono più argomenti di quelli forniti si -otterranno dei valori indefiniti. Nel caso del \cmd{gcc} l'uso della macro -\macro{va\_end} è inutile, ma si consiglia di usarlo ugualmente per -compatibilità. - -Le definizioni delle tre macro sono le seguenti: +otterranno dei valori indefiniti. Nel caso del \cmd{gcc} l'uso di +\macro{va\_end} è inutile, ma si consiglia di usarla ugualmente per +compatibilità. Le definizioni delle macro citate sono le seguenti: \begin{functions} \headdecl{stdarg.h} @@ -1859,12 +1858,11 @@ Le definizioni delle tre macro sono le seguenti: In generale si possono avere più puntatori alla lista degli argomenti, ciascuno andrà inizializzato con \macro{va\_start} e letto con \macro{va\_arg} -e ciascuno potrà scandire la lista degli argomenti per conto suo. - -Dopo l'uso di \macro{va\_end} la variabile \param{ap} diventa indefinita e -successive chiamate a \macro{va\_arg} non funzioneranno. Si avranno risultati -indefiniti anche chiamando \macro{va\_arg} specificando un tipo che non -corrisponde a quello dell'argomento. +e ciascuno potrà scandire la lista degli argomenti per conto suo. Dopo l'uso +di \macro{va\_end} la variabile \param{ap} diventa indefinita e successive +chiamate a \macro{va\_arg} non funzioneranno. Si avranno risultati indefiniti +anche chiamando \macro{va\_arg} specificando un tipo che non corrisponde a +quello dell'argomento. Un altro limite delle macro è che i passi 1) e 3) devono essere eseguiti nel corpo principale della funzione, il passo 2) invece può essere eseguito anche @@ -1874,13 +1872,12 @@ usato (lo standard richiederebbe la chiamata esplicita di \macro{va\_end}), dato che il valore di \param{ap} risulterebbe indefinito. Esistono dei casi in cui è necessario eseguire più volte la scansione degli -argomenti e poter memorizzare una posizione durante la stessa. La cosa più -naturale in questo caso sembrerebbe quella di copiarsi il puntatore alla lista -degli argomenti con una semplice assegnazione. Dato che una delle -realizzazioni più comuni di \macro{va\_list} è quella di un puntatore nello -\itindex{stack} \textit{stack} all'indirizzo dove sono stati salvati gli -argomenti, è assolutamente normale pensare di poter effettuare questa -operazione. +argomenti e poter memorizzare una posizione durante la stessa. In questo caso +sembrerebbe naturale copiarsi il puntatore alla lista degli argomenti con una +semplice assegnazione. Dato che una delle realizzazioni più comuni di +\macro{va\_list} è quella di un puntatore nello \itindex{stack} \textit{stack} +all'indirizzo dove sono stati salvati gli argomenti, è assolutamente normale +pensare di poter effettuare questa operazione. In generale però possono esistere anche realizzazioni diverse, per questo motivo \macro{va\_list} è definito come \index{tipo!opaco} \textsl{tipo opaco} @@ -2050,7 +2047,7 @@ interagiscono direttamente con la gestione dello \itindex{stack} \func{setjmp} è implementata con una macro, pertanto non si può cercare di ottenerne l'indirizzo, ed inoltre delle chiamate a questa funzione sono sicure solo in uno dei seguenti casi: -\begin{itemize} +\begin{itemize*} \item come espressione di controllo in un comando condizionale, di selezione o di iterazione (come \code{if}, \code{switch} o \code{while}); \item come operando per un operatore di uguaglianza o confronto in una @@ -2059,11 +2056,12 @@ solo in uno dei seguenti casi: \item come operando per l'operatore di negazione (\code{!}) in una espressione di controllo di un comando condizionale, di selezione o di iterazione; \item come espressione a sé stante. -\end{itemize} +\end{itemize*} In generale, dato che l'unica differenza fra la chiamata diretta e quella -ottenuta da un \func{longjmp} è costituita dal valore di ritorno di -\func{setjmp}, essa è usualmente chiamata all'interno di un comando \code{if}. +ottenuta nell'uscita con un \func{longjmp} è costituita dal valore di ritorno +di \func{setjmp}, quest'ultima usualmente viene chiamata all'interno di un +comando \code{if}. Uno dei punti critici dei salti non-locali è quello del valore delle variabili, ed in particolare quello delle variabili automatiche della funzione