Newsgroup: it.comp.lang.c
Titolo: Carattere "#" per forza a colonna 1?

Ciao NG,
Il mio ormai "solito" progetto sta diventando ingestibile,
anche a causa della confusione tipografica. Molte parti
dei miei sorgenti, anche dentro strutture di controllo
parecchio nidificate, sono afflitte da una quantità di
"#ifdef" eccetera.
Mi pare di aver letto che lo standard prescrive che il
carattere "#" debba stare a colonna 1; se anche gcc è
abbastanza tollerante da accettare che non faccia così, mi
chiedo se indentando come vorrei io si possano un domani
creare problemi alla portabilità del codice.
Che ne pensate??? Grazie!
Apx.
-- 
Vorrei morire dormendo come mio nonno
e non urlando come i suoi passeggeri.

 creare problemi alla portabilitï¿œ del codice.



Che io ricordi, sono consentiti spazi sia prima che dopo il carattere
'#'.
Personalmente preferisco la seconda sintassi, perché rende più chiaro
il blocco di preprocessore, tipo:
#ifdef PIPPO
#    ifndef PLUTO
#        include <paperino.h>
#    else
#        include <paperone.h>
#    endif
#endif
Ciao!

 creare problemi alla portabilità del codice.
[...]
Ciao!
Lo Standard non prescrive che '#' debba stare sulla prima colonna di
indentazione. Probabilmente hai letto: "the first token in the sequence
is a # preprocessing token that [...] is either the _first character_
_in the source file_ or [...]", ma fai attenzione che si riferisce al
caso in cui la direttiva sia la "prima linea" di codice nel sorgente,
non dice nulla a proposito della tabulazione a prima colonna.
E' comunque probabile che implementazioni ormai obsolete e preesistenti
allo Standard C89 richiedano la restrizione della "prima colonna"
(alcune restrizioni sono tanto più vincolanti quanto più primitivo è
il compilatore..).
Bisogna fare anche attenzione agli spazi bianchi^1 effettivamente
permessi dallo Standard: la direttiva comincia dall'ultimo spazio bianco
escluso prima di '#' (che contenga, opzionalmente, un new-line) e
finisce con il successivo carattere di new-line incluso. Questo per
quanto riguarda l'inizio e la fine. All'interno della direttiva, gli
unici "spazi bianchi" ammessi sono combinazioni di:
  - "commento"
  - "carattere spazio" (quello della barra spaziatrice per intenderci,
                        o quello che rimpiazza i commenti)
  - "tab orizzontale"
_Esempi_:
/* direttiva nulla */# /* VALIDO */
#
include <stdio.h> /* ERRORE: new-line fa terminare la direttiva */
/* questo è bizzarro */# /* ma è permesso */ define /* VALIDO */ MACRO
L'esempio che ha mostrato FtM è in effetti un modo che molti programma-
tori usano per riconoscere fasi di preprocessing in sorgenti molto
estesi: per individuarle subito basta guardare quando compare '#' sulla
prima colonna, poi il resto della direttiva puo' seguire l'indentazione
del resto del sorgente:
#include <stdio.h>
int main(void){
     int n = 12, max = 10;
     if (n > max)
#           ifndef NEW_MAX
#               define NEW_MAX 20
#           endif
             max = NEW_MAX;
     printf("max = %d\n", max);
     return 0;
}
Tuttavia, è caldamente sconsigliato mischiare direttive per il preproces-
sore con il resto del codice.
1. Uno "spazio bianco" è una combinazione di uno o più dei seguenti
    elementi: commento, carattere spazio, tab orizzontale, tab verticale,
    new-line, form-feed. [Scusa il misto di italiano e inglese, ma credo
    siano più eloquenti i termini dello Standard a volte].
-- 
Non puoi insegnare qualcosa ad un uomo. You cannot teach a man anything.
Lo puoi solo aiutare   --  Galileo  Galilei  --   You can only help him
a scoprirla dentro di sé.                        discover it in himself.
Vincenzo Mercuri

 Che ne pensate??? Grazie!
grazie a tutti, come sempre :)
