xref: /openbmc/linux/Documentation/translations/it_IT/process/coding-style.rst (revision edba5eecfd6e96ea9b8e3e5b1db1f9dc9eb77af8)
1*edba5eecSFederico Vaga.. include:: ../disclaimer-ita.rst
2*edba5eecSFederico Vaga
3*edba5eecSFederico Vaga:Original: :ref:`Documentation/process/coding-style.rst <codingstyle>`
4*edba5eecSFederico Vaga:Translator: Federico Vaga <federico.vaga@vaga.pv.it>
5*edba5eecSFederico Vaga
6*edba5eecSFederico Vaga.. _it_codingstyle:
7*edba5eecSFederico Vaga
8*edba5eecSFederico VagaStile del codice per il kernel Linux
9*edba5eecSFederico Vaga====================================
10*edba5eecSFederico Vaga
11*edba5eecSFederico VagaQuesto è un breve documento che descrive lo stile di codice preferito per
12*edba5eecSFederico Vagail kernel Linux.  Lo stile di codifica è molto personale e non voglio
13*edba5eecSFederico Vaga**forzare** nessuno ad accettare il mio, ma questo stile è quello che
14*edba5eecSFederico Vagadev'essere usato per qualsiasi cosa che io sia in grado di mantenere, e l'ho
15*edba5eecSFederico Vagapreferito anche per molte altre cose.  Per favore, almeno tenete in
16*edba5eecSFederico Vagaconsiderazione le osservazioni espresse qui.
17*edba5eecSFederico Vaga
18*edba5eecSFederico VagaLa prima cosa che suggerisco è quella di stamparsi una copia degli standard
19*edba5eecSFederico Vagadi codifica GNU e di NON leggerla.  Bruciatela, è un grande gesto simbolico.
20*edba5eecSFederico Vaga
21*edba5eecSFederico VagaComunque, ecco i punti:
22*edba5eecSFederico Vaga
23*edba5eecSFederico Vaga1) Indentazione
24*edba5eecSFederico Vaga---------------
25*edba5eecSFederico Vaga
26*edba5eecSFederico VagaLa tabulazione (tab) è di 8 caratteri e così anche le indentazioni. Ci sono
27*edba5eecSFederico Vagaalcuni movimenti di eretici che vorrebbero l'indentazione a 4 (o perfino 2!)
28*edba5eecSFederico Vagacaratteri di profondità, che è simile al tentativo di definire il valore del
29*edba5eecSFederico Vagapi-greco a 3.
30*edba5eecSFederico Vaga
31*edba5eecSFederico VagaMotivazione: l'idea dell'indentazione è di definire chiaramente dove un blocco
32*edba5eecSFederico Vagadi controllo inizia e finisce.  Specialmente quando siete rimasti a guardare lo
33*edba5eecSFederico Vagaschermo per 20 ore a file, troverete molto più facile capire i livelli di
34*edba5eecSFederico Vagaindentazione se questi sono larghi.
35*edba5eecSFederico Vaga
36*edba5eecSFederico VagaOra, alcuni rivendicano che un'indentazione da 8 caratteri sposta il codice
37*edba5eecSFederico Vagatroppo a destra e che quindi rende difficile la lettura su schermi a 80
38*edba5eecSFederico Vagacaratteri.  La risposta a questa affermazione è che se vi servono più di 3
39*edba5eecSFederico Vagalivelli di indentazione, siete comunque fregati e dovreste correggere il vostro
40*edba5eecSFederico Vagaprogramma.
41*edba5eecSFederico Vaga
42*edba5eecSFederico VagaIn breve, l'indentazione ad 8 caratteri rende più facile la lettura, e in
43*edba5eecSFederico Vagaaggiunta vi avvisa quando state annidando troppo le vostre funzioni.
44*edba5eecSFederico VagaTenete ben a mente questo avviso.
45*edba5eecSFederico Vaga
46*edba5eecSFederico VagaAl fine di facilitare l'indentazione del costrutto switch, si preferisce
47*edba5eecSFederico Vagaallineare sulla stessa colonna la parola chiave ``switch`` e i suoi
48*edba5eecSFederico Vagasubordinati ``case``. In questo modo si evita una doppia indentazione per
49*edba5eecSFederico Vagai ``case``.  Un esempio.:
50*edba5eecSFederico Vaga
51*edba5eecSFederico Vaga.. code-block:: c
52*edba5eecSFederico Vaga
53*edba5eecSFederico Vaga	switch (suffix) {
54*edba5eecSFederico Vaga	case 'G':
55*edba5eecSFederico Vaga	case 'g':
56*edba5eecSFederico Vaga		mem <<= 30;
57*edba5eecSFederico Vaga		break;
58*edba5eecSFederico Vaga	case 'M':
59*edba5eecSFederico Vaga	case 'm':
60*edba5eecSFederico Vaga		mem <<= 20;
61*edba5eecSFederico Vaga		break;
62*edba5eecSFederico Vaga	case 'K':
63*edba5eecSFederico Vaga	case 'k':
64*edba5eecSFederico Vaga		mem <<= 10;
65*edba5eecSFederico Vaga		/* fall through */
66*edba5eecSFederico Vaga	default:
67*edba5eecSFederico Vaga		break;
68*edba5eecSFederico Vaga	}
69*edba5eecSFederico Vaga
70*edba5eecSFederico VagaA meno che non vogliate nascondere qualcosa, non mettete più istruzioni sulla
71*edba5eecSFederico Vagastessa riga:
72*edba5eecSFederico Vaga
73*edba5eecSFederico Vaga.. code-block:: c
74*edba5eecSFederico Vaga
75*edba5eecSFederico Vaga	if (condition) do_this;
76*edba5eecSFederico Vaga	  do_something_everytime;
77*edba5eecSFederico Vaga
78*edba5eecSFederico Vagané mettete più assegnamenti sulla stessa riga.  Lo stile del kernel
79*edba5eecSFederico Vagaè ultrasemplice.  Evitate espressioni intricate.
80*edba5eecSFederico Vaga
81*edba5eecSFederico VagaAl di fuori dei commenti, della documentazione ed escludendo i Kconfig, gli
82*edba5eecSFederico Vagaspazi non vengono mai usati per l'indentazione, e l'esempio qui sopra è
83*edba5eecSFederico Vagavolutamente errato.
84*edba5eecSFederico Vaga
85*edba5eecSFederico VagaProcuratevi un buon editor di testo e non lasciate spazi bianchi alla fine
86*edba5eecSFederico Vagadelle righe.
87*edba5eecSFederico Vaga
88*edba5eecSFederico Vaga
89*edba5eecSFederico Vaga2) Spezzare righe lunghe e stringhe
90*edba5eecSFederico Vaga-----------------------------------
91*edba5eecSFederico Vaga
92*edba5eecSFederico VagaLo stile del codice riguarda la leggibilità e la manutenibilità utilizzando
93*edba5eecSFederico Vagastrumenti comuni.
94*edba5eecSFederico Vaga
95*edba5eecSFederico VagaIl limite delle righe è di 80 colonne e questo e un limite fortemente
96*edba5eecSFederico Vagadesiderato.
97*edba5eecSFederico Vaga
98*edba5eecSFederico VagaEspressioni più lunghe di 80 colonne saranno spezzettate in pezzi più piccoli,
99*edba5eecSFederico Vagaa meno che eccedere le 80 colonne non aiuti ad aumentare la leggibilità senza
100*edba5eecSFederico Vaganascondere informazioni.  I pezzi derivati sono sostanzialmente più corti degli
101*edba5eecSFederico Vagaoriginali e vengono posizionati più a destra.  Lo stesso si applica, nei file
102*edba5eecSFederico Vagad'intestazione, alle funzioni con una lista di argomenti molto lunga. Tuttavia,
103*edba5eecSFederico Vaganon spezzettate mai le stringhe visibili agli utenti come i messaggi di
104*edba5eecSFederico Vagaprintk, questo perché inibireste la possibilità d'utilizzare grep per cercarle.
105*edba5eecSFederico Vaga
106*edba5eecSFederico Vaga3) Posizionamento di parentesi graffe e spazi
107*edba5eecSFederico Vaga---------------------------------------------
108*edba5eecSFederico Vaga
109*edba5eecSFederico VagaUn altro problema che s'affronta sempre quando si parla di stile in C è
110*edba5eecSFederico Vagail posizionamento delle parentesi graffe.  Al contrario della dimensione
111*edba5eecSFederico Vagadell'indentazione, non ci sono motivi tecnici sulla base dei quali scegliere
112*edba5eecSFederico Vagauna strategia di posizionamento o un'altra; ma il modo qui preferito,
113*edba5eecSFederico Vagacome mostratoci dai profeti Kernighan e Ritchie, è quello di
114*edba5eecSFederico Vagaposizionare la parentesi graffa di apertura per ultima sulla riga, e quella
115*edba5eecSFederico Vagadi chiusura per prima su una nuova riga, così:
116*edba5eecSFederico Vaga
117*edba5eecSFederico Vaga.. code-block:: c
118*edba5eecSFederico Vaga
119*edba5eecSFederico Vaga	if (x is true) {
120*edba5eecSFederico Vaga		we do y
121*edba5eecSFederico Vaga	}
122*edba5eecSFederico Vaga
123*edba5eecSFederico VagaQuesto è valido per tutte le espressioni che non siano funzioni (if, switch,
124*edba5eecSFederico Vagafor, while, do).  Per esempio:
125*edba5eecSFederico Vaga
126*edba5eecSFederico Vaga.. code-block:: c
127*edba5eecSFederico Vaga
128*edba5eecSFederico Vaga	switch (action) {
129*edba5eecSFederico Vaga	case KOBJ_ADD:
130*edba5eecSFederico Vaga		return "add";
131*edba5eecSFederico Vaga	case KOBJ_REMOVE:
132*edba5eecSFederico Vaga		return "remove";
133*edba5eecSFederico Vaga	case KOBJ_CHANGE:
134*edba5eecSFederico Vaga		return "change";
135*edba5eecSFederico Vaga	default:
136*edba5eecSFederico Vaga		return NULL;
137*edba5eecSFederico Vaga	}
138*edba5eecSFederico Vaga
139*edba5eecSFederico VagaTuttavia, c'è il caso speciale, le funzioni: queste hanno la parentesi graffa
140*edba5eecSFederico Vagadi apertura all'inizio della riga successiva, quindi:
141*edba5eecSFederico Vaga
142*edba5eecSFederico Vaga.. code-block:: c
143*edba5eecSFederico Vaga
144*edba5eecSFederico Vaga	int function(int x)
145*edba5eecSFederico Vaga	{
146*edba5eecSFederico Vaga		body of function
147*edba5eecSFederico Vaga	}
148*edba5eecSFederico Vaga
149*edba5eecSFederico VagaEretici da tutto il mondo affermano che questa incoerenza è ...
150*edba5eecSFederico Vagainsomma ... incoerente, ma tutte le persone ragionevoli sanno che (a)
151*edba5eecSFederico VagaK&R hanno **ragione** e (b) K&R hanno ragione.  A parte questo, le funzioni
152*edba5eecSFederico Vagasono comunque speciali (non potete annidarle in C).
153*edba5eecSFederico Vaga
154*edba5eecSFederico VagaNotate che la graffa di chiusura è da sola su una riga propria, ad
155*edba5eecSFederico Vaga**eccezione** di quei casi dove è seguita dalla continuazione della stessa
156*edba5eecSFederico Vagaespressione, in pratica ``while`` nell'espressione do-while, oppure ``else``
157*edba5eecSFederico Vaganell'espressione if-else, come questo:
158*edba5eecSFederico Vaga
159*edba5eecSFederico Vaga.. code-block:: c
160*edba5eecSFederico Vaga
161*edba5eecSFederico Vaga	do {
162*edba5eecSFederico Vaga		body of do-loop
163*edba5eecSFederico Vaga	} while (condition);
164*edba5eecSFederico Vaga
165*edba5eecSFederico Vagae
166*edba5eecSFederico Vaga
167*edba5eecSFederico Vaga.. code-block:: c
168*edba5eecSFederico Vaga
169*edba5eecSFederico Vaga	if (x == y) {
170*edba5eecSFederico Vaga		..
171*edba5eecSFederico Vaga	} else if (x > y) {
172*edba5eecSFederico Vaga		...
173*edba5eecSFederico Vaga	} else {
174*edba5eecSFederico Vaga		....
175*edba5eecSFederico Vaga	}
176*edba5eecSFederico Vaga
177*edba5eecSFederico VagaMotivazione: K&R.
178*edba5eecSFederico Vaga
179*edba5eecSFederico VagaInoltre, notate che questo posizionamento delle graffe minimizza il numero
180*edba5eecSFederico Vagadi righe vuote senza perdere di leggibilità.  In questo modo, dato che le
181*edba5eecSFederico Vagarighe sul vostro schermo non sono una risorsa illimitata (pensate ad uno
182*edba5eecSFederico Vagaterminale con 25 righe), avrete delle righe vuote da riempire con dei
183*edba5eecSFederico Vagacommenti.
184*edba5eecSFederico Vaga
185*edba5eecSFederico VagaNon usate inutilmente le graffe dove una singola espressione è sufficiente.
186*edba5eecSFederico Vaga
187*edba5eecSFederico Vaga.. code-block:: c
188*edba5eecSFederico Vaga
189*edba5eecSFederico Vaga	if (condition)
190*edba5eecSFederico Vaga		action();
191*edba5eecSFederico Vaga
192*edba5eecSFederico Vagae
193*edba5eecSFederico Vaga
194*edba5eecSFederico Vaga.. code-block:: none
195*edba5eecSFederico Vaga
196*edba5eecSFederico Vaga	if (condition)
197*edba5eecSFederico Vaga		do_this();
198*edba5eecSFederico Vaga	else
199*edba5eecSFederico Vaga		do_that();
200*edba5eecSFederico Vaga
201*edba5eecSFederico VagaQuesto non vale nel caso in cui solo un ramo dell'espressione if-else
202*edba5eecSFederico Vagacontiene una sola espressione; in quest'ultimo caso usate le graffe per
203*edba5eecSFederico Vagaentrambe i rami:
204*edba5eecSFederico Vaga
205*edba5eecSFederico Vaga.. code-block:: c
206*edba5eecSFederico Vaga
207*edba5eecSFederico Vaga	if (condition) {
208*edba5eecSFederico Vaga		do_this();
209*edba5eecSFederico Vaga		do_that();
210*edba5eecSFederico Vaga	} else {
211*edba5eecSFederico Vaga		otherwise();
212*edba5eecSFederico Vaga	}
213*edba5eecSFederico Vaga
214*edba5eecSFederico VagaInoltre, usate le graffe se un ciclo contiene più di una semplice istruzione:
215*edba5eecSFederico Vaga
216*edba5eecSFederico Vaga.. code-block:: c
217*edba5eecSFederico Vaga
218*edba5eecSFederico Vaga	while (condition) {
219*edba5eecSFederico Vaga		if (test)
220*edba5eecSFederico Vaga			do_something();
221*edba5eecSFederico Vaga	}
222*edba5eecSFederico Vaga
223*edba5eecSFederico Vaga3.1) Spazi
224*edba5eecSFederico Vaga**********
225*edba5eecSFederico Vaga
226*edba5eecSFederico VagaLo stile del kernel Linux per quanto riguarda gli spazi, dipende
227*edba5eecSFederico Vaga(principalmente) dalle funzioni e dalle parole chiave.  Usate una spazio dopo
228*edba5eecSFederico Vaga(quasi tutte) le parole chiave.  L'eccezioni più evidenti sono sizeof, typeof,
229*edba5eecSFederico Vagaalignof, e __attribute__, il cui aspetto è molto simile a quello delle
230*edba5eecSFederico Vagafunzioni (e in Linux, solitamente, sono usate con le parentesi, anche se il
231*edba5eecSFederico Vagalinguaggio non lo richiede; come ``sizeof info`` dopo aver dichiarato
232*edba5eecSFederico Vaga``struct fileinfo info``).
233*edba5eecSFederico Vaga
234*edba5eecSFederico VagaQuindi utilizzate uno spazio dopo le seguenti parole chiave::
235*edba5eecSFederico Vaga
236*edba5eecSFederico Vaga	if, switch, case, for, do, while
237*edba5eecSFederico Vaga
238*edba5eecSFederico Vagama non con sizeof, typeof, alignof, o __attribute__.  Ad esempio,
239*edba5eecSFederico Vaga
240*edba5eecSFederico Vaga.. code-block:: c
241*edba5eecSFederico Vaga
242*edba5eecSFederico Vaga
243*edba5eecSFederico Vaga	s = sizeof(struct file);
244*edba5eecSFederico Vaga
245*edba5eecSFederico VagaNon aggiungete spazi attorno (dentro) ad un'espressione fra parentesi. Questo
246*edba5eecSFederico Vagaesempio è **brutto**:
247*edba5eecSFederico Vaga
248*edba5eecSFederico Vaga.. code-block:: c
249*edba5eecSFederico Vaga
250*edba5eecSFederico Vaga
251*edba5eecSFederico Vaga	s = sizeof( struct file );
252*edba5eecSFederico Vaga
253*edba5eecSFederico VagaQuando dichiarate un puntatore ad una variabile o una funzione che ritorna un
254*edba5eecSFederico Vagapuntatore, il posto suggerito per l'asterisco ``*`` è adiacente al nome della
255*edba5eecSFederico Vagavariabile o della funzione, e non adiacente al nome del tipo. Esempi:
256*edba5eecSFederico Vaga
257*edba5eecSFederico Vaga.. code-block:: c
258*edba5eecSFederico Vaga
259*edba5eecSFederico Vaga
260*edba5eecSFederico Vaga	char *linux_banner;
261*edba5eecSFederico Vaga	unsigned long long memparse(char *ptr, char **retptr);
262*edba5eecSFederico Vaga	char *match_strdup(substring_t *s);
263*edba5eecSFederico Vaga
264*edba5eecSFederico VagaUsate uno spazio attorno (da ogni parte) alla maggior parte degli operatori
265*edba5eecSFederico Vagabinari o ternari, come i seguenti::
266*edba5eecSFederico Vaga
267*edba5eecSFederico Vaga	=  +  -  <  >  *  /  %  |  &  ^  <=  >=  ==  !=  ?  :
268*edba5eecSFederico Vaga
269*edba5eecSFederico Vagama non mettete spazi dopo gli operatori unari::
270*edba5eecSFederico Vaga
271*edba5eecSFederico Vaga	&  *  +  -  ~  !  sizeof  typeof  alignof  __attribute__  defined
272*edba5eecSFederico Vaga
273*edba5eecSFederico Vaganessuno spazio dopo l'operatore unario suffisso di incremento o decremento::
274*edba5eecSFederico Vaga
275*edba5eecSFederico Vaga	++  --
276*edba5eecSFederico Vaga
277*edba5eecSFederico Vaganessuno spazio dopo l'operatore unario prefisso di incremento o decremento::
278*edba5eecSFederico Vaga
279*edba5eecSFederico Vaga	++  --
280*edba5eecSFederico Vaga
281*edba5eecSFederico Vagae nessuno spazio attorno agli operatori dei membri di una struttura ``.`` e
282*edba5eecSFederico Vaga``->``.
283*edba5eecSFederico Vaga
284*edba5eecSFederico VagaNon lasciate spazi bianchi alla fine delle righe.  Alcuni editor con
285*edba5eecSFederico Vagal'indentazione ``furba`` inseriranno gli spazi bianchi all'inizio di una nuova
286*edba5eecSFederico Vagariga in modo appropriato, quindi potrete scrivere la riga di codice successiva
287*edba5eecSFederico Vagaimmediatamente.  Tuttavia, alcuni di questi stessi editor non rimuovono
288*edba5eecSFederico Vagaquesti spazi bianchi quando non scrivete nulla sulla nuova riga, ad esempio
289*edba5eecSFederico Vagaperché volete lasciare una riga vuota.  Il risultato è che finirete per avere
290*edba5eecSFederico Vagadelle righe che contengono spazi bianchi in coda.
291*edba5eecSFederico Vaga
292*edba5eecSFederico VagaGit vi avviserà delle modifiche che aggiungono questi spazi vuoti di fine riga,
293*edba5eecSFederico Vagae può opzionalmente rimuoverli per conto vostro; tuttavia, se state applicando
294*edba5eecSFederico Vagauna serie di modifiche, questo potrebbe far fallire delle modifiche successive
295*edba5eecSFederico Vagaperché il contesto delle righe verrà cambiato.
296*edba5eecSFederico Vaga
297*edba5eecSFederico Vaga4) Assegnare nomi
298*edba5eecSFederico Vaga-----------------
299*edba5eecSFederico Vaga
300*edba5eecSFederico VagaC è un linguaggio spartano, e così dovrebbero esserlo i vostri nomi.  Al
301*edba5eecSFederico Vagacontrario dei programmatori Modula-2 o Pascal, i programmatori C non usano
302*edba5eecSFederico Vaganomi graziosi come ThisVariableIsATemporaryCounter.  Un programmatore C
303*edba5eecSFederico Vagachiamerebbe questa variabile ``tmp``, che è molto più facile da scrivere e
304*edba5eecSFederico Vaganon è una delle più difficili da capire.
305*edba5eecSFederico Vaga
306*edba5eecSFederico VagaTUTTAVIA, nonostante i nomi con notazione mista siano da condannare, i nomi
307*edba5eecSFederico Vagadescrittivi per variabili globali sono un dovere.  Chiamare una funzione
308*edba5eecSFederico Vagaglobale ``pippo`` è un insulto.
309*edba5eecSFederico Vaga
310*edba5eecSFederico VagaLe variabili GLOBALI (da usare solo se vi servono **davvero**) devono avere
311*edba5eecSFederico Vagadei nomi descrittivi, così come le funzioni globali.  Se avete una funzione
312*edba5eecSFederico Vagache conta gli utenti attivi, dovreste chiamarla ``count_active_users()`` o
313*edba5eecSFederico Vagaqualcosa di simile, **non** dovreste chiamarla ``cntusr()``.
314*edba5eecSFederico Vaga
315*edba5eecSFederico VagaCodificare il tipo di funzione nel suo nome (quella cosa chiamata notazione
316*edba5eecSFederico Vagaungherese) fa male al cervello - il compilatore conosce comunque il tipo e
317*edba5eecSFederico Vagapuò verificarli, e inoltre confonde i programmatori.  Non c'è da
318*edba5eecSFederico Vagasorprendersi che MicroSoft faccia programmi bacati.
319*edba5eecSFederico Vaga
320*edba5eecSFederico VagaLe variabili LOCALI dovrebbero avere nomi corti, e significativi.  Se avete
321*edba5eecSFederico Vagaun qualsiasi contatore di ciclo, probabilmente sarà chiamato ``i``.
322*edba5eecSFederico VagaChiamarlo ``loop_counter`` non è produttivo, non ci sono possibilità che
323*edba5eecSFederico Vaga``i`` possa non essere capito.  Analogamente, ``tmp`` può essere una qualsiasi
324*edba5eecSFederico Vagavariabile che viene usata per salvare temporaneamente un valore.
325*edba5eecSFederico Vaga
326*edba5eecSFederico VagaSe avete paura di fare casino coi nomi delle vostre variabili locali, allora
327*edba5eecSFederico Vagaavete un altro problema che è chiamato sindrome dello squilibrio dell'ormone
328*edba5eecSFederico Vagadella crescita delle funzioni. Vedere il capitolo 6 (funzioni).
329*edba5eecSFederico Vaga
330*edba5eecSFederico Vaga5) Definizione di tipi (typedef)
331*edba5eecSFederico Vaga--------------------------------
332*edba5eecSFederico Vaga
333*edba5eecSFederico VagaPer favore non usate cose come ``vps_t``.
334*edba5eecSFederico VagaUsare il typedef per strutture e puntatori è uno **sbaglio**. Quando vedete:
335*edba5eecSFederico Vaga
336*edba5eecSFederico Vaga.. code-block:: c
337*edba5eecSFederico Vaga
338*edba5eecSFederico Vaga	vps_t a;
339*edba5eecSFederico Vaga
340*edba5eecSFederico Vaganei sorgenti, cosa significa?
341*edba5eecSFederico VagaSe, invece, dicesse:
342*edba5eecSFederico Vaga
343*edba5eecSFederico Vaga.. code-block:: c
344*edba5eecSFederico Vaga
345*edba5eecSFederico Vaga	struct virtual_container *a;
346*edba5eecSFederico Vaga
347*edba5eecSFederico Vagapotreste dire cos'è effettivamente ``a``.
348*edba5eecSFederico Vaga
349*edba5eecSFederico VagaMolte persone pensano che la definizione dei tipi ``migliori la leggibilità``.
350*edba5eecSFederico VagaNon molto. Sono utili per:
351*edba5eecSFederico Vaga
352*edba5eecSFederico Vaga (a) gli oggetti completamente opachi (dove typedef viene proprio usato allo
353*edba5eecSFederico Vaga     scopo di **nascondere** cosa sia davvero l'oggetto).
354*edba5eecSFederico Vaga
355*edba5eecSFederico Vaga     Esempio: ``pte_t`` eccetera sono oggetti opachi che potete usare solamente
356*edba5eecSFederico Vaga     con le loro funzioni accessorie.
357*edba5eecSFederico Vaga
358*edba5eecSFederico Vaga     .. note::
359*edba5eecSFederico Vaga       Gli oggetti opachi e le ``funzioni accessorie`` non sono, di per se,
360*edba5eecSFederico Vaga       una bella cosa. Il motivo per cui abbiamo cose come pte_t eccetera è
361*edba5eecSFederico Vaga       che davvero non c'è alcuna informazione portabile.
362*edba5eecSFederico Vaga
363*edba5eecSFederico Vaga (b) i tipi chiaramente interi, dove l'astrazione **aiuta** ad evitare
364*edba5eecSFederico Vaga     confusione sul fatto che siano ``int`` oppure ``long``.
365*edba5eecSFederico Vaga
366*edba5eecSFederico Vaga     u8/u16/u32 sono typedef perfettamente accettabili, anche se ricadono
367*edba5eecSFederico Vaga     nella categoria (d) piuttosto che in questa.
368*edba5eecSFederico Vaga
369*edba5eecSFederico Vaga     .. note::
370*edba5eecSFederico Vaga
371*edba5eecSFederico Vaga       Ancora - dev'esserci una **ragione** per farlo. Se qualcosa è
372*edba5eecSFederico Vaga       ``unsigned long``, non c'è alcun bisogno di avere:
373*edba5eecSFederico Vaga
374*edba5eecSFederico Vaga        typedef unsigned long myfalgs_t;
375*edba5eecSFederico Vaga
376*edba5eecSFederico Vaga      ma se ci sono chiare circostanze in cui potrebbe essere ``unsigned int``
377*edba5eecSFederico Vaga      e in altre configurazioni ``unsigned long``, allora certamente typedef
378*edba5eecSFederico Vaga      è una buona scelta.
379*edba5eecSFederico Vaga
380*edba5eecSFederico Vaga (c) quando di rado create letteralmente dei **nuovi** tipi su cui effettuare
381*edba5eecSFederico Vaga     verifiche.
382*edba5eecSFederico Vaga
383*edba5eecSFederico Vaga (d) circostanze eccezionali, in cui si definiscono nuovi tipi identici a
384*edba5eecSFederico Vaga     quelli definiti dallo standard C99.
385*edba5eecSFederico Vaga
386*edba5eecSFederico Vaga     Nonostante ci voglia poco tempo per abituare occhi e cervello all'uso dei
387*edba5eecSFederico Vaga     tipi standard come ``uint32_t``, alcune persone ne obiettano l'uso.
388*edba5eecSFederico Vaga
389*edba5eecSFederico Vaga     Perciò, i tipi specifici di Linux ``u8/u16/u32/u64`` e i loro equivalenti
390*edba5eecSFederico Vaga     con segno, identici ai tipi standard, sono permessi- tuttavia, non sono
391*edba5eecSFederico Vaga     obbligatori per il nuovo codice.
392*edba5eecSFederico Vaga
393*edba5eecSFederico Vaga (e) i tipi sicuri nella spazio utente.
394*edba5eecSFederico Vaga
395*edba5eecSFederico Vaga     In alcune strutture dati visibili dallo spazio utente non possiamo
396*edba5eecSFederico Vaga     richiedere l'uso dei tipi C99 e nemmeno i vari ``u32`` descritti prima.
397*edba5eecSFederico Vaga     Perciò, utilizziamo __u32 e tipi simili in tutte le strutture dati
398*edba5eecSFederico Vaga     condivise con lo spazio utente.
399*edba5eecSFederico Vaga
400*edba5eecSFederico VagaMagari ci sono altri casi validi, ma la regola di base dovrebbe essere di
401*edba5eecSFederico Vaganon usare MAI MAI un typedef a meno che non rientri in una delle regole
402*edba5eecSFederico Vagadescritte qui.
403*edba5eecSFederico Vaga
404*edba5eecSFederico VagaIn generale, un puntatore, o una struttura a cui si ha accesso diretto in
405*edba5eecSFederico Vagamodo ragionevole, non dovrebbero **mai** essere definite con un typedef.
406*edba5eecSFederico Vaga
407*edba5eecSFederico Vaga6) Funzioni
408*edba5eecSFederico Vaga-----------
409*edba5eecSFederico Vaga
410*edba5eecSFederico VagaLe funzioni dovrebbero essere brevi e carine, e fare una cosa sola.  Dovrebbero
411*edba5eecSFederico Vagaoccupare uno o due schermi di testo (come tutti sappiamo, la dimensione
412*edba5eecSFederico Vagadi uno schermo secondo ISO/ANSI è di 80x24), e fare una cosa sola e bene.
413*edba5eecSFederico Vaga
414*edba5eecSFederico VagaLa massima lunghezza di una funziona è inversamente proporzionale alla sua
415*edba5eecSFederico Vagacomplessità e al livello di indentazione di quella funzione.  Quindi, se avete
416*edba5eecSFederico Vagauna funzione che è concettualmente semplice ma che è implementata come un
417*edba5eecSFederico Vagalunga (ma semplice) sequenza di caso-istruzione, dove avete molte piccole cose
418*edba5eecSFederico Vagaper molti casi differenti, allora va bene avere funzioni più lunghe.
419*edba5eecSFederico Vaga
420*edba5eecSFederico VagaComunque, se avete una funzione complessa e sospettate che uno studente
421*edba5eecSFederico Vaganon particolarmente dotato del primo anno delle scuole superiori potrebbe
422*edba5eecSFederico Vaganon capire cosa faccia la funzione, allora dovreste attenervi strettamente ai
423*edba5eecSFederico Vagalimiti.  Usate funzioni di supporto con nomi descrittivi (potete chiedere al
424*edba5eecSFederico Vagacompilatore di renderle inline se credete che sia necessario per le
425*edba5eecSFederico Vagaprestazioni, e probabilmente farà un lavoro migliore di quanto avreste potuto
426*edba5eecSFederico Vagafare voi).
427*edba5eecSFederico Vaga
428*edba5eecSFederico VagaUn'altra misura delle funzioni sono il numero di variabili locali.  Non
429*edba5eecSFederico Vagadovrebbero eccedere le 5-10, oppure state sbagliando qualcosa.  Ripensate la
430*edba5eecSFederico Vagafunzione, e dividetela in pezzettini.  Generalmente, un cervello umano può
431*edba5eecSFederico Vagaseguire facilmente circa 7 cose diverse, di più lo confonderebbe.  Lo sai
432*edba5eecSFederico Vagad'essere brillante, ma magari vorresti riuscire a capire cos'avevi fatto due
433*edba5eecSFederico Vagasettimane prima.
434*edba5eecSFederico Vaga
435*edba5eecSFederico VagaNei file sorgenti, separate le funzioni con una riga vuota.  Se la funzione è
436*edba5eecSFederico Vagaesportata, la macro **EXPORT** per questa funzione deve seguire immediatamente
437*edba5eecSFederico Vagala riga della parentesi graffa di chiusura. Ad esempio:
438*edba5eecSFederico Vaga
439*edba5eecSFederico Vaga.. code-block:: c
440*edba5eecSFederico Vaga
441*edba5eecSFederico Vaga	int system_is_up(void)
442*edba5eecSFederico Vaga	{
443*edba5eecSFederico Vaga		return system_state == SYSTEM_RUNNING;
444*edba5eecSFederico Vaga	}
445*edba5eecSFederico Vaga	EXPORT_SYMBOL(system_is_up);
446*edba5eecSFederico Vaga
447*edba5eecSFederico VagaNei prototipi di funzione, includete i nomi dei parametri e i loro tipi.
448*edba5eecSFederico VagaNonostante questo non sia richiesto dal linguaggio C, in Linux viene preferito
449*edba5eecSFederico Vagaperché è un modo semplice per aggiungere informazioni importanti per il
450*edba5eecSFederico Vagalettore.
451*edba5eecSFederico Vaga
452*edba5eecSFederico Vaga7) Centralizzare il ritorno delle funzioni
453*edba5eecSFederico Vaga------------------------------------------
454*edba5eecSFederico Vaga
455*edba5eecSFederico VagaSebbene sia deprecata da molte persone, l'istruzione goto è impiegata di
456*edba5eecSFederico Vagafrequente dai compilatori sotto forma di salto incondizionato.
457*edba5eecSFederico Vaga
458*edba5eecSFederico VagaL'istruzione goto diventa utile quando una funzione ha punti d'uscita multipli
459*edba5eecSFederico Vagae vanno eseguite alcune procedure di pulizia in comune.  Se non è necessario
460*edba5eecSFederico Vagapulire alcunché, allora ritornate direttamente.
461*edba5eecSFederico Vaga
462*edba5eecSFederico VagaAssegnate un nome all'etichetta di modo che suggerisca cosa fa la goto o
463*edba5eecSFederico Vagaperché esiste.  Un esempio di un buon nome potrebbe essere ``out_free_buffer:``
464*edba5eecSFederico Vagase la goto libera (free) un ``buffer``.  Evitate l'uso di nomi GW-BASIC come
465*edba5eecSFederico Vaga``err1:`` ed ``err2:``, potreste doverli riordinare se aggiungete o rimuovete
466*edba5eecSFederico Vagapunti d'uscita, e inoltre rende difficile verificarne la correttezza.
467*edba5eecSFederico Vaga
468*edba5eecSFederico VagaI motivo per usare le goto sono:
469*edba5eecSFederico Vaga
470*edba5eecSFederico Vaga- i salti incondizionati sono più facili da capire e seguire
471*edba5eecSFederico Vaga- l'annidamento si riduce
472*edba5eecSFederico Vaga- si evita di dimenticare, per errore, di aggiornare un singolo punto d'uscita
473*edba5eecSFederico Vaga- aiuta il compilatore ad ottimizzare il codice ridondante ;)
474*edba5eecSFederico Vaga
475*edba5eecSFederico Vaga.. code-block:: c
476*edba5eecSFederico Vaga
477*edba5eecSFederico Vaga	int fun(int a)
478*edba5eecSFederico Vaga	{
479*edba5eecSFederico Vaga		int result = 0;
480*edba5eecSFederico Vaga		char *buffer;
481*edba5eecSFederico Vaga
482*edba5eecSFederico Vaga		buffer = kmalloc(SIZE, GFP_KERNEL);
483*edba5eecSFederico Vaga		if (!buffer)
484*edba5eecSFederico Vaga			return -ENOMEM;
485*edba5eecSFederico Vaga
486*edba5eecSFederico Vaga		if (condition1) {
487*edba5eecSFederico Vaga			while (loop1) {
488*edba5eecSFederico Vaga				...
489*edba5eecSFederico Vaga			}
490*edba5eecSFederico Vaga			result = 1;
491*edba5eecSFederico Vaga			goto out_free_buffer;
492*edba5eecSFederico Vaga		}
493*edba5eecSFederico Vaga		...
494*edba5eecSFederico Vaga	out_free_buffer:
495*edba5eecSFederico Vaga		kfree(buffer);
496*edba5eecSFederico Vaga		return result;
497*edba5eecSFederico Vaga	}
498*edba5eecSFederico Vaga
499*edba5eecSFederico VagaUn baco abbastanza comune di cui bisogna prendere nota è il ``one err bugs``
500*edba5eecSFederico Vagache assomiglia a questo:
501*edba5eecSFederico Vaga
502*edba5eecSFederico Vaga.. code-block:: c
503*edba5eecSFederico Vaga
504*edba5eecSFederico Vaga	err:
505*edba5eecSFederico Vaga		kfree(foo->bar);
506*edba5eecSFederico Vaga		kfree(foo);
507*edba5eecSFederico Vaga		return ret;
508*edba5eecSFederico Vaga
509*edba5eecSFederico VagaIl baco in questo codice è che in alcuni punti d'uscita la variabile ``foo`` è
510*edba5eecSFederico VagaNULL.  Normalmente si corregge questo baco dividendo la gestione dell'errore in
511*edba5eecSFederico Vagadue parti ``err_free_bar:`` e ``err_free_foo:``:
512*edba5eecSFederico Vaga
513*edba5eecSFederico Vaga.. code-block:: c
514*edba5eecSFederico Vaga
515*edba5eecSFederico Vaga	 err_free_bar:
516*edba5eecSFederico Vaga		kfree(foo->bar);
517*edba5eecSFederico Vaga	 err_free_foo:
518*edba5eecSFederico Vaga		kfree(foo);
519*edba5eecSFederico Vaga		return ret;
520*edba5eecSFederico Vaga
521*edba5eecSFederico VagaIdealmente, dovreste simulare condizioni d'errore per verificare i vostri
522*edba5eecSFederico Vagapercorsi d'uscita.
523*edba5eecSFederico Vaga
524*edba5eecSFederico Vaga
525*edba5eecSFederico Vaga8) Commenti
526*edba5eecSFederico Vaga-----------
527*edba5eecSFederico Vaga
528*edba5eecSFederico VagaI commenti sono una buona cosa, ma c'è anche il rischio di esagerare.  MAI
529*edba5eecSFederico Vagaspiegare COME funziona il vostro codice in un commento: è molto meglio
530*edba5eecSFederico Vagascrivere il codice di modo che il suo funzionamento sia ovvio, inoltre
531*edba5eecSFederico Vagaspiegare codice scritto male è una perdita di tempo.
532*edba5eecSFederico Vaga
533*edba5eecSFederico VagaSolitamente, i commenti devono dire COSA fa il codice, e non COME lo fa.
534*edba5eecSFederico VagaInoltre, cercate di evitare i commenti nel corpo della funzione: se la
535*edba5eecSFederico Vagafunzione è così complessa che dovete commentarla a pezzi, allora dovreste
536*edba5eecSFederico Vagatornare al punto 6 per un momento.  Potete mettere dei piccoli commenti per
537*edba5eecSFederico Vagaannotare o avvisare il lettore circa un qualcosa di particolarmente arguto
538*edba5eecSFederico Vaga(o brutto), ma cercate di non esagerare.  Invece, mettete i commenti in
539*edba5eecSFederico Vagatesta alla funzione spiegando alle persone cosa fa, e possibilmente anche
540*edba5eecSFederico Vagail PERCHÉ.
541*edba5eecSFederico Vaga
542*edba5eecSFederico VagaPer favore, quando commentate una funzione dell'API del kernel usate il
543*edba5eecSFederico Vagaformato kernel-doc.  Per maggiori dettagli, leggete i file in
544*edba5eecSFederico Vaga:ref::ref:`Documentation/translations/it_IT/doc-guide/ <it_doc_guide>` e in
545*edba5eecSFederico Vaga``script/kernel-doc``.
546*edba5eecSFederico Vaga
547*edba5eecSFederico VagaLo stile preferito per i commenti più lunghi (multi-riga) è:
548*edba5eecSFederico Vaga
549*edba5eecSFederico Vaga.. code-block:: c
550*edba5eecSFederico Vaga
551*edba5eecSFederico Vaga	/*
552*edba5eecSFederico Vaga	 * This is the preferred style for multi-line
553*edba5eecSFederico Vaga	 * comments in the Linux kernel source code.
554*edba5eecSFederico Vaga	 * Please use it consistently.
555*edba5eecSFederico Vaga	 *
556*edba5eecSFederico Vaga	 * Description:  A column of asterisks on the left side,
557*edba5eecSFederico Vaga	 * with beginning and ending almost-blank lines.
558*edba5eecSFederico Vaga	 */
559*edba5eecSFederico Vaga
560*edba5eecSFederico VagaPer i file in net/ e in drivers/net/ lo stile preferito per i commenti
561*edba5eecSFederico Vagapiù lunghi (multi-riga) è leggermente diverso.
562*edba5eecSFederico Vaga
563*edba5eecSFederico Vaga.. code-block:: c
564*edba5eecSFederico Vaga
565*edba5eecSFederico Vaga	/* The preferred comment style for files in net/ and drivers/net
566*edba5eecSFederico Vaga	 * looks like this.
567*edba5eecSFederico Vaga	 *
568*edba5eecSFederico Vaga	 * It is nearly the same as the generally preferred comment style,
569*edba5eecSFederico Vaga	 * but there is no initial almost-blank line.
570*edba5eecSFederico Vaga	 */
571*edba5eecSFederico Vaga
572*edba5eecSFederico VagaÈ anche importante commentare i dati, sia per i tipi base che per tipi
573*edba5eecSFederico Vagaderivati.  A questo scopo, dichiarate un dato per riga (niente virgole
574*edba5eecSFederico Vagaper una dichiarazione multipla).  Questo vi lascerà spazio per un piccolo
575*edba5eecSFederico Vagacommento per spiegarne l'uso.
576*edba5eecSFederico Vaga
577*edba5eecSFederico Vaga
578*edba5eecSFederico Vaga9) Avete fatto un pasticcio
579*edba5eecSFederico Vaga---------------------------
580*edba5eecSFederico Vaga
581*edba5eecSFederico VagaVa bene, li facciamo tutti.  Probabilmente vi è stato detto dal vostro
582*edba5eecSFederico Vagaaiutante Unix di fiducia che ``GNU emacs`` formatta automaticamente il
583*edba5eecSFederico Vagacodice C per conto vostro, e avete notato che sì, in effetti lo fa, ma che
584*edba5eecSFederico Vagai modi predefiniti non sono proprio allettanti (infatti, sono peggio che
585*edba5eecSFederico Vagapremere tasti a caso - un numero infinito di scimmie che scrivono in
586*edba5eecSFederico VagaGNU emacs non faranno mai un buon programma).
587*edba5eecSFederico Vaga
588*edba5eecSFederico VagaQuindi, potete sbarazzarvi di GNU emacs, o riconfigurarlo con valori più
589*edba5eecSFederico Vagasensati.  Per fare quest'ultima cosa, potete appiccicare il codice che
590*edba5eecSFederico Vagasegue nel vostro file .emacs:
591*edba5eecSFederico Vaga
592*edba5eecSFederico Vaga.. code-block:: none
593*edba5eecSFederico Vaga
594*edba5eecSFederico Vaga  (defun c-lineup-arglist-tabs-only (ignored)
595*edba5eecSFederico Vaga    "Line up argument lists by tabs, not spaces"
596*edba5eecSFederico Vaga    (let* ((anchor (c-langelem-pos c-syntactic-element))
597*edba5eecSFederico Vaga           (column (c-langelem-2nd-pos c-syntactic-element))
598*edba5eecSFederico Vaga           (offset (- (1+ column) anchor))
599*edba5eecSFederico Vaga           (steps (floor offset c-basic-offset)))
600*edba5eecSFederico Vaga      (* (max steps 1)
601*edba5eecSFederico Vaga         c-basic-offset)))
602*edba5eecSFederico Vaga
603*edba5eecSFederico Vaga  (add-hook 'c-mode-common-hook
604*edba5eecSFederico Vaga            (lambda ()
605*edba5eecSFederico Vaga              ;; Add kernel style
606*edba5eecSFederico Vaga              (c-add-style
607*edba5eecSFederico Vaga               "linux-tabs-only"
608*edba5eecSFederico Vaga               '("linux" (c-offsets-alist
609*edba5eecSFederico Vaga                          (arglist-cont-nonempty
610*edba5eecSFederico Vaga                           c-lineup-gcc-asm-reg
611*edba5eecSFederico Vaga                           c-lineup-arglist-tabs-only))))))
612*edba5eecSFederico Vaga
613*edba5eecSFederico Vaga  (add-hook 'c-mode-hook
614*edba5eecSFederico Vaga            (lambda ()
615*edba5eecSFederico Vaga              (let ((filename (buffer-file-name)))
616*edba5eecSFederico Vaga                ;; Enable kernel mode for the appropriate files
617*edba5eecSFederico Vaga                (when (and filename
618*edba5eecSFederico Vaga                           (string-match (expand-file-name "~/src/linux-trees")
619*edba5eecSFederico Vaga                                         filename))
620*edba5eecSFederico Vaga                  (setq indent-tabs-mode t)
621*edba5eecSFederico Vaga                  (setq show-trailing-whitespace t)
622*edba5eecSFederico Vaga                  (c-set-style "linux-tabs-only")))))
623*edba5eecSFederico Vaga
624*edba5eecSFederico VagaQuesto farà funzionare meglio emacs con lo stile del kernel per i file che
625*edba5eecSFederico Vagasi trovano nella cartella ``~/src/linux-trees``.
626*edba5eecSFederico Vaga
627*edba5eecSFederico VagaMa anche se doveste fallire nell'ottenere una formattazione sensata in emacs
628*edba5eecSFederico Vaganon tutto è perduto: usate ``indent``.
629*edba5eecSFederico Vaga
630*edba5eecSFederico VagaOra, ancora, GNU indent ha la stessa configurazione decerebrata di GNU emacs,
631*edba5eecSFederico Vagaed è per questo che dovete passargli alcune opzioni da riga di comando.
632*edba5eecSFederico VagaTuttavia, non è così terribile, perché perfino i creatori di GNU indent
633*edba5eecSFederico Vagariconoscono l'autorità di K&R (le persone del progetto GNU non sono cattive,
634*edba5eecSFederico Vagasono solo mal indirizzate sull'argomento), quindi date ad indent le opzioni
635*edba5eecSFederico Vaga``-kr -i8`` (che significa ``K&R, 8 caratteri di indentazione``), o utilizzate
636*edba5eecSFederico Vaga``scripts/Lindent`` che indenterà usando l'ultimo stile.
637*edba5eecSFederico Vaga
638*edba5eecSFederico Vaga``indent`` ha un sacco di opzioni, e specialmente quando si tratta di
639*edba5eecSFederico Vagariformattare i commenti dovreste dare un'occhiata alle pagine man.
640*edba5eecSFederico VagaMa ricordatevi: ``indent`` non è un correttore per una cattiva programmazione.
641*edba5eecSFederico Vaga
642*edba5eecSFederico VagaDa notare che potete utilizzare anche ``clang-format`` per aiutarvi con queste
643*edba5eecSFederico Vagaregole, per riformattare rapidamente ad automaticamente alcune parti del
644*edba5eecSFederico Vagavostro codice, e per revisionare interi file al fine di identificare errori
645*edba5eecSFederico Vagadi stile, refusi e possibilmente anche delle migliorie. È anche utile per
646*edba5eecSFederico Vagaordinare gli ``#include``, per allineare variabili/macro, per ridistribuire
647*edba5eecSFederico Vagail testo e altre cose simili.
648*edba5eecSFederico VagaPer maggiori dettagli, consultate il file
649*edba5eecSFederico Vaga:ref:`Documentation/translations/it_IT/process/clang-format.rst <it_clangformat>`.
650*edba5eecSFederico Vaga
651*edba5eecSFederico Vaga
652*edba5eecSFederico Vaga10) File di configurazione Kconfig
653*edba5eecSFederico Vaga----------------------------------
654*edba5eecSFederico Vaga
655*edba5eecSFederico VagaPer tutti i file di configurazione Kconfig* che si possono trovare nei
656*edba5eecSFederico Vagasorgenti, l'indentazione è un po' differente.  Le linee dopo un ``config``
657*edba5eecSFederico Vagasono indentate con un tab, mentre il testo descrittivo è indentato di
658*edba5eecSFederico Vagaulteriori due spazi.  Esempio::
659*edba5eecSFederico Vaga
660*edba5eecSFederico Vaga  config AUDIT
661*edba5eecSFederico Vaga	bool "Auditing support"
662*edba5eecSFederico Vaga	depends on NET
663*edba5eecSFederico Vaga	help
664*edba5eecSFederico Vaga	  Enable auditing infrastructure that can be used with another
665*edba5eecSFederico Vaga	  kernel subsystem, such as SELinux (which requires this for
666*edba5eecSFederico Vaga	  logging of avc messages output).  Does not do system-call
667*edba5eecSFederico Vaga	  auditing without CONFIG_AUDITSYSCALL.
668*edba5eecSFederico Vaga
669*edba5eecSFederico VagaLe funzionalità davvero pericolose (per esempio il supporto alla scrittura
670*edba5eecSFederico Vagaper certi filesystem) dovrebbero essere dichiarate chiaramente come tali
671*edba5eecSFederico Vaganella stringa di titolo::
672*edba5eecSFederico Vaga
673*edba5eecSFederico Vaga  config ADFS_FS_RW
674*edba5eecSFederico Vaga	bool "ADFS write support (DANGEROUS)"
675*edba5eecSFederico Vaga	depends on ADFS_FS
676*edba5eecSFederico Vaga	...
677*edba5eecSFederico Vaga
678*edba5eecSFederico VagaPer la documentazione completa sui file di configurazione, consultate
679*edba5eecSFederico Vagail documento Documentation/translations/it_IT/kbuild/kconfig-language.txt
680*edba5eecSFederico Vaga
681*edba5eecSFederico Vaga
682*edba5eecSFederico Vaga11) Strutture dati
683*edba5eecSFederico Vaga------------------
684*edba5eecSFederico Vaga
685*edba5eecSFederico VagaLe strutture dati che hanno una visibilità superiore al contesto del
686*edba5eecSFederico Vagasingolo thread in cui vengono create e distrutte, dovrebbero sempre
687*edba5eecSFederico Vagaavere un contatore di riferimenti.  Nel kernel non esiste un
688*edba5eecSFederico Vaga*garbage collector* (e fuori dal kernel i *garbage collector* sono lenti
689*edba5eecSFederico Vagae inefficienti), questo significa che **dovete** assolutamente avere un
690*edba5eecSFederico Vagacontatore di riferimenti per ogni cosa che usate.
691*edba5eecSFederico Vaga
692*edba5eecSFederico VagaAvere un contatore di riferimenti significa che potete evitare la
693*edba5eecSFederico Vagasincronizzazione e permette a più utenti di accedere alla struttura dati
694*edba5eecSFederico Vagain parallelo - e non doversi preoccupare di una struttura dati che
695*edba5eecSFederico Vagaimprovvisamente sparisce dalla loro vista perché il loro processo dormiva
696*edba5eecSFederico Vagao stava facendo altro per un attimo.
697*edba5eecSFederico Vaga
698*edba5eecSFederico VagaDa notare che la sincronizzazione **non** si sostituisce al conteggio dei
699*edba5eecSFederico Vagariferimenti.  La sincronizzazione ha lo scopo di mantenere le strutture
700*edba5eecSFederico Vagadati coerenti, mentre il conteggio dei riferimenti è una tecnica di gestione
701*edba5eecSFederico Vagadella memoria.  Solitamente servono entrambe le cose, e non vanno confuse fra
702*edba5eecSFederico Vagadi loro.
703*edba5eecSFederico Vaga
704*edba5eecSFederico VagaQuando si hanno diverse classi di utenti, le strutture dati possono avere
705*edba5eecSFederico Vagadue livelli di contatori di riferimenti.  Il contatore di classe conta
706*edba5eecSFederico Vagail numero dei suoi utenti, e il contatore globale viene decrementato una
707*edba5eecSFederico Vagasola volta quando il contatore di classe va a zero.
708*edba5eecSFederico Vaga
709*edba5eecSFederico VagaUn esempio di questo tipo di conteggio dei riferimenti multi-livello può
710*edba5eecSFederico Vagaessere trovato nella gestore della memoria (``struct mm_sturct``: mm_user e
711*edba5eecSFederico Vagamm_count), e nel codice dei filesystem (``struct super_block``: s_count e
712*edba5eecSFederico Vagas_active).
713*edba5eecSFederico Vaga
714*edba5eecSFederico VagaRicordatevi: se un altro thread può trovare la vostra struttura dati, e non
715*edba5eecSFederico Vagaavete un contatore di riferimenti per essa, quasi certamente avete un baco.
716*edba5eecSFederico Vaga
717*edba5eecSFederico Vaga12) Macro, enumerati e RTL
718*edba5eecSFederico Vaga---------------------------
719*edba5eecSFederico Vaga
720*edba5eecSFederico VagaI nomi delle macro che definiscono delle costanti e le etichette degli
721*edba5eecSFederico Vagaenumerati sono scritte in maiuscolo.
722*edba5eecSFederico Vaga
723*edba5eecSFederico Vaga.. code-block:: c
724*edba5eecSFederico Vaga
725*edba5eecSFederico Vaga	#define CONSTANT 0x12345
726*edba5eecSFederico Vaga
727*edba5eecSFederico VagaGli enumerati sono da preferire quando si definiscono molte costanti correlate.
728*edba5eecSFederico Vaga
729*edba5eecSFederico VagaI nomi delle macro in MAIUSCOLO sono preferibili ma le macro che assomigliano
730*edba5eecSFederico Vagaa delle funzioni possono essere scritte in minuscolo.
731*edba5eecSFederico Vaga
732*edba5eecSFederico VagaGeneralmente, le funzioni inline sono preferibili rispetto alle macro che
733*edba5eecSFederico Vagasembrano funzioni.
734*edba5eecSFederico Vaga
735*edba5eecSFederico VagaLe macro che contengono più istruzioni dovrebbero essere sempre chiuse in un
736*edba5eecSFederico Vagablocco do - while:
737*edba5eecSFederico Vaga
738*edba5eecSFederico Vaga.. code-block:: c
739*edba5eecSFederico Vaga
740*edba5eecSFederico Vaga	#define macrofun(a, b, c)			\
741*edba5eecSFederico Vaga		do {					\
742*edba5eecSFederico Vaga			if (a == 5)			\
743*edba5eecSFederico Vaga				do_this(b, c);		\
744*edba5eecSFederico Vaga		} while (0)
745*edba5eecSFederico Vaga
746*edba5eecSFederico VagaCose da evitare quando si usano le macro:
747*edba5eecSFederico Vaga
748*edba5eecSFederico Vaga1) le macro che hanno effetti sul flusso del codice:
749*edba5eecSFederico Vaga
750*edba5eecSFederico Vaga.. code-block:: c
751*edba5eecSFederico Vaga
752*edba5eecSFederico Vaga	#define FOO(x)					\
753*edba5eecSFederico Vaga		do {					\
754*edba5eecSFederico Vaga			if (blah(x) < 0)		\
755*edba5eecSFederico Vaga				return -EBUGGERED;	\
756*edba5eecSFederico Vaga		} while (0)
757*edba5eecSFederico Vaga
758*edba5eecSFederico Vagasono **proprio** una pessima idea.  Sembra una chiamata a funzione ma termina
759*edba5eecSFederico Vagala funzione chiamante; non cercate di rompere il decodificatore interno di
760*edba5eecSFederico Vagachi legge il codice.
761*edba5eecSFederico Vaga
762*edba5eecSFederico Vaga2) le macro che dipendono dall'uso di una variabile locale con un nome magico:
763*edba5eecSFederico Vaga
764*edba5eecSFederico Vaga.. code-block:: c
765*edba5eecSFederico Vaga
766*edba5eecSFederico Vaga	#define FOO(val) bar(index, val)
767*edba5eecSFederico Vaga
768*edba5eecSFederico Vagapotrebbe sembrare una bella cosa, ma è dannatamente confusionario quando uno
769*edba5eecSFederico Vagalegge il codice e potrebbe romperlo con una cambiamento che sembra innocente.
770*edba5eecSFederico Vaga
771*edba5eecSFederico Vaga3) le macro con argomenti che sono utilizzati come l-values; questo potrebbe
772*edba5eecSFederico Vagaritorcervisi contro se qualcuno, per esempio, trasforma FOO in una funzione
773*edba5eecSFederico Vagainline.
774*edba5eecSFederico Vaga
775*edba5eecSFederico Vaga4) dimenticatevi delle precedenze: le macro che definiscono espressioni devono
776*edba5eecSFederico Vagaessere racchiuse fra parentesi. State attenti a problemi simili con le macro
777*edba5eecSFederico Vagaparametrizzate.
778*edba5eecSFederico Vaga
779*edba5eecSFederico Vaga.. code-block:: c
780*edba5eecSFederico Vaga
781*edba5eecSFederico Vaga	#define CONSTANT 0x4000
782*edba5eecSFederico Vaga	#define CONSTEXP (CONSTANT | 3)
783*edba5eecSFederico Vaga
784*edba5eecSFederico Vaga5) collisione nello spazio dei nomi quando si definisce una variabile locale in
785*edba5eecSFederico Vagauna macro che sembra una funzione:
786*edba5eecSFederico Vaga
787*edba5eecSFederico Vaga.. code-block:: c
788*edba5eecSFederico Vaga
789*edba5eecSFederico Vaga	#define FOO(x)				\
790*edba5eecSFederico Vaga	({					\
791*edba5eecSFederico Vaga		typeof(x) ret;			\
792*edba5eecSFederico Vaga		ret = calc_ret(x);		\
793*edba5eecSFederico Vaga		(ret);				\
794*edba5eecSFederico Vaga	})
795*edba5eecSFederico Vaga
796*edba5eecSFederico Vagaret è un nome comune per una variabile locale - __foo_ret difficilmente
797*edba5eecSFederico Vagaandrà in conflitto con una variabile già esistente.
798*edba5eecSFederico Vaga
799*edba5eecSFederico VagaIl manuale di cpp si occupa esaustivamente delle macro. Il manuale di sviluppo
800*edba5eecSFederico Vagadi gcc copre anche l'RTL che viene usato frequentemente nel kernel per il
801*edba5eecSFederico Vagalinguaggio assembler.
802*edba5eecSFederico Vaga
803*edba5eecSFederico Vaga13) Visualizzare i messaggi del kernel
804*edba5eecSFederico Vaga--------------------------------------
805*edba5eecSFederico Vaga
806*edba5eecSFederico VagaAgli sviluppatori del kernel piace essere visti come dotti. Tenete un occhio
807*edba5eecSFederico Vagadi riguardo per l'ortografia e farete una belle figura. In inglese, evitate
808*edba5eecSFederico Vagal'uso di parole mozzate come ``dont``: usate ``do not`` oppure ``don't``.
809*edba5eecSFederico VagaScrivete messaggi concisi, chiari, e inequivocabili.
810*edba5eecSFederico Vaga
811*edba5eecSFederico VagaI messaggi del kernel non devono terminare con un punto fermo.
812*edba5eecSFederico Vaga
813*edba5eecSFederico VagaScrivere i numeri fra parentesi (%d) non migliora alcunché e per questo
814*edba5eecSFederico Vagadovrebbero essere evitati.
815*edba5eecSFederico Vaga
816*edba5eecSFederico VagaCi sono alcune macro per la diagnostica in <linux/device.h> che dovreste
817*edba5eecSFederico Vagausare per assicurarvi che i messaggi vengano associati correttamente ai
818*edba5eecSFederico Vagadispositivi e ai driver, e che siano etichettati correttamente:  dev_err(),
819*edba5eecSFederico Vagadev_warn(), dev_info(), e così via.  Per messaggi che non sono associati ad
820*edba5eecSFederico Vagaalcun dispositivo, <linux/printk.h> definisce pr_info(), pr_warn(), pr_err(),
821*edba5eecSFederico Vagaeccetera.
822*edba5eecSFederico Vaga
823*edba5eecSFederico VagaTirar fuori un buon messaggio di debug può essere una vera sfida; e quando
824*edba5eecSFederico Vagal'avete può essere d'enorme aiuto per risolvere problemi da remoto.
825*edba5eecSFederico VagaTuttavia, i messaggi di debug sono gestiti differentemente rispetto agli
826*edba5eecSFederico Vagaaltri.  Le funzioni pr_XXX() stampano incondizionatamente ma pr_debug() no;
827*edba5eecSFederico Vagaessa non viene compilata nella configurazione predefinita, a meno che
828*edba5eecSFederico VagaDEBUG o CONFIG_DYNAMIC_DEBUG non vengono impostati.  Questo vale anche per
829*edba5eecSFederico Vagadev_dbg() e in aggiunta VERBOSE_DEBUG per aggiungere i messaggi dev_vdbg().
830*edba5eecSFederico Vaga
831*edba5eecSFederico VagaMolti sottosistemi hanno delle opzioni di debug in Kconfig che aggiungono
832*edba5eecSFederico Vaga-DDEBUG nei corrispettivi Makefile, e in altri casi aggiungono #define DEBUG
833*edba5eecSFederico Vagain specifici file.  Infine, quando un messaggio di debug dev'essere stampato
834*edba5eecSFederico Vagaincondizionatamente, per esempio perché siete già in una sezione di debug
835*edba5eecSFederico Vagaracchiusa in #ifdef, potete usare printk(KERN_DEBUG ...).
836*edba5eecSFederico Vaga
837*edba5eecSFederico Vaga14) Assegnare memoria
838*edba5eecSFederico Vaga---------------------
839*edba5eecSFederico Vaga
840*edba5eecSFederico VagaIl kernel fornisce i seguenti assegnatori ad uso generico:
841*edba5eecSFederico Vagakmalloc(), kzalloc(), kmalloc_array(), kcalloc(), vmalloc(), e vzalloc().
842*edba5eecSFederico VagaPer maggiori informazioni, consultate la documentazione dell'API.
843*edba5eecSFederico Vaga
844*edba5eecSFederico VagaIl modo preferito per passare la dimensione di una struttura è il seguente:
845*edba5eecSFederico Vaga
846*edba5eecSFederico Vaga.. code-block:: c
847*edba5eecSFederico Vaga
848*edba5eecSFederico Vaga	p = kmalloc(sizeof(*p), ...);
849*edba5eecSFederico Vaga
850*edba5eecSFederico VagaLa forma alternativa, dove il nome della struttura viene scritto interamente,
851*edba5eecSFederico Vagapeggiora la leggibilità e introduce possibili bachi quando il tipo di
852*edba5eecSFederico Vagapuntatore cambia tipo ma il corrispondente sizeof non viene aggiornato.
853*edba5eecSFederico Vaga
854*edba5eecSFederico VagaIl valore di ritorno è un puntatore void, effettuare un cast su di esso è
855*edba5eecSFederico Vagaridondante. La conversione fra un puntatore void e un qualsiasi altro tipo
856*edba5eecSFederico Vagadi puntatore è garantito dal linguaggio di programmazione C.
857*edba5eecSFederico Vaga
858*edba5eecSFederico VagaIl modo preferito per assegnare un vettore è il seguente:
859*edba5eecSFederico Vaga
860*edba5eecSFederico Vaga.. code-block:: c
861*edba5eecSFederico Vaga
862*edba5eecSFederico Vaga	p = kmalloc_array(n, sizeof(...), ...);
863*edba5eecSFederico Vaga
864*edba5eecSFederico VagaIl modo preferito per assegnare un vettore a zero è il seguente:
865*edba5eecSFederico Vaga
866*edba5eecSFederico Vaga.. code-block:: c
867*edba5eecSFederico Vaga
868*edba5eecSFederico Vaga	p = kcalloc(n, sizeof(...), ...);
869*edba5eecSFederico Vaga
870*edba5eecSFederico VagaEntrambe verificano la condizione di overflow per la dimensione
871*edba5eecSFederico Vagad'assegnamento n * sizeof(...), se accade ritorneranno NULL.
872*edba5eecSFederico Vaga
873*edba5eecSFederico Vaga15) Il morbo inline
874*edba5eecSFederico Vaga-------------------
875*edba5eecSFederico Vaga
876*edba5eecSFederico VagaSembra che ci sia la percezione errata che gcc abbia una qualche magica
877*edba5eecSFederico Vagaopzione "rendimi più veloce" chiamata ``inline``. In alcuni casi l'uso di
878*edba5eecSFederico Vagainline è appropriato (per esempio in sostituzione delle macro, vedi
879*edba5eecSFederico Vagacapitolo 12), ma molto spesso non lo è. L'uso abbondante della parola chiave
880*edba5eecSFederico Vagainline porta ad avere un kernel più grande, che si traduce in un sistema nel
881*edba5eecSFederico Vagasuo complesso più lento per via di una cache per le istruzioni della CPU più
882*edba5eecSFederico Vagagrande e poi semplicemente perché ci sarà meno spazio disponibile per una
883*edba5eecSFederico Vagapagina di cache. Pensateci un attimo; una fallimento nella cache causa una
884*edba5eecSFederico Vagaricerca su disco che può tranquillamente richiedere 5 millisecondi. Ci sono
885*edba5eecSFederico VagaTANTI cicli di CPU che potrebbero essere usati in questi 5 millisecondi.
886*edba5eecSFederico Vaga
887*edba5eecSFederico VagaSpesso le persone dicono che aggiungere inline a delle funzioni dichiarate
888*edba5eecSFederico Vagastatic e utilizzare una sola volta è sempre una scelta vincente perché non
889*edba5eecSFederico Vagaci sono altri compromessi. Questo è tecnicamente vero ma gcc è in grado di
890*edba5eecSFederico Vagatrasformare automaticamente queste funzioni in inline; i problemi di
891*edba5eecSFederico Vagamanutenzione del codice per rimuovere gli inline quando compare un secondo
892*edba5eecSFederico Vagautente surclassano il potenziale vantaggio nel suggerire a gcc di fare una
893*edba5eecSFederico Vagacosa che avrebbe fatto comunque.
894*edba5eecSFederico Vaga
895*edba5eecSFederico Vaga16) Nomi e valori di ritorno delle funzioni
896*edba5eecSFederico Vaga-------------------------------------------
897*edba5eecSFederico Vaga
898*edba5eecSFederico VagaLe funzioni possono ritornare diversi tipi di valori, e uno dei più comuni
899*edba5eecSFederico Vagaè quel valore che indica se una funzione ha completato con successo o meno.
900*edba5eecSFederico VagaQuesto valore può essere rappresentato come un codice di errore intero
901*edba5eecSFederico Vaga(-Exxx = fallimento, 0 = successo) oppure un booleano di successo
902*edba5eecSFederico Vaga(0 = fallimento, non-zero = successo).
903*edba5eecSFederico Vaga
904*edba5eecSFederico VagaMischiare questi due tipi di rappresentazioni è un terreno fertile per
905*edba5eecSFederico Vagai bachi più insidiosi.  Se il linguaggio C includesse una forte distinzione
906*edba5eecSFederico Vagafra gli interi e i booleani, allora il compilatore potrebbe trovare questi
907*edba5eecSFederico Vagaerrori per conto nostro ... ma questo non c'è.  Per evitare di imbattersi
908*edba5eecSFederico Vagain questo tipo di baco, seguite sempre la seguente convenzione::
909*edba5eecSFederico Vaga
910*edba5eecSFederico Vaga	Se il nome di una funzione è un'azione o un comando imperativo,
911*edba5eecSFederico Vaga	essa dovrebbe ritornare un codice di errore intero.  Se il nome
912*edba5eecSFederico Vaga	è un predicato, la funzione dovrebbe ritornare un booleano di
913*edba5eecSFederico Vaga	"successo"
914*edba5eecSFederico Vaga
915*edba5eecSFederico VagaPer esempio, ``add work`` è un comando, e la funzione add_work() ritorna 0
916*edba5eecSFederico Vagain caso di successo o -EBUSY in caso di fallimento.  Allo stesso modo,
917*edba5eecSFederico Vaga``PCI device present`` è un predicato, e la funzione pci_dev_present() ritorna
918*edba5eecSFederico Vaga1 se trova il dispositivo corrispondente con successo, altrimenti 0.
919*edba5eecSFederico Vaga
920*edba5eecSFederico VagaTutte le funzioni esportate (EXPORT) devono rispettare questa convenzione, e
921*edba5eecSFederico Vagacosì dovrebbero anche tutte le funzioni pubbliche.  Le funzioni private
922*edba5eecSFederico Vaga(static) possono non seguire questa convenzione, ma è comunque raccomandato
923*edba5eecSFederico Vagache lo facciano.
924*edba5eecSFederico Vaga
925*edba5eecSFederico VagaLe funzioni il cui valore di ritorno è il risultato di una computazione,
926*edba5eecSFederico Vagapiuttosto che l'indicazione sul successo di tale computazione, non sono
927*edba5eecSFederico Vagasoggette a questa regola.  Solitamente si indicano gli errori ritornando un
928*edba5eecSFederico Vagaqualche valore fuori dai limiti.  Un tipico esempio è quello delle funzioni
929*edba5eecSFederico Vagache ritornano un puntatore; queste utilizzano NULL o ERR_PTR come meccanismo
930*edba5eecSFederico Vagadi notifica degli errori.
931*edba5eecSFederico Vaga
932*edba5eecSFederico Vaga17) Non reinventate le macro del kernel
933*edba5eecSFederico Vaga---------------------------------------
934*edba5eecSFederico Vaga
935*edba5eecSFederico VagaIl file di intestazione include/linux/kernel.h contiene un certo numero
936*edba5eecSFederico Vagadi macro che dovreste usare piuttosto che implementarne una qualche variante.
937*edba5eecSFederico VagaPer esempio, se dovete calcolare la lunghezza di un vettore, sfruttate la
938*edba5eecSFederico Vagamacro:
939*edba5eecSFederico Vaga
940*edba5eecSFederico Vaga.. code-block:: c
941*edba5eecSFederico Vaga
942*edba5eecSFederico Vaga	#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
943*edba5eecSFederico Vaga
944*edba5eecSFederico VagaAnalogamente, se dovete calcolare la dimensione di un qualche campo di una
945*edba5eecSFederico Vagastruttura, usate
946*edba5eecSFederico Vaga
947*edba5eecSFederico Vaga.. code-block:: c
948*edba5eecSFederico Vaga
949*edba5eecSFederico Vaga	#define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f))
950*edba5eecSFederico Vaga
951*edba5eecSFederico VagaCi sono anche le macro min() e max() che, se vi serve, effettuano un controllo
952*edba5eecSFederico Vagarigido sui tipi.  Sentitevi liberi di leggere attentamente questo file
953*edba5eecSFederico Vagad'intestazione per scoprire cos'altro è stato definito che non dovreste
954*edba5eecSFederico Vagareinventare nel vostro codice.
955*edba5eecSFederico Vaga
956*edba5eecSFederico Vaga18) Linee di configurazione degli editor e altre schifezze
957*edba5eecSFederico Vaga-----------------------------------------------------------
958*edba5eecSFederico Vaga
959*edba5eecSFederico VagaAlcuni editor possono interpretare dei parametri di configurazione integrati
960*edba5eecSFederico Vaganei file sorgenti e indicati con dai marcatori speciali.  Per esempio, emacs
961*edba5eecSFederico Vagainterpreta le linee marcate nel seguente modo:
962*edba5eecSFederico Vaga
963*edba5eecSFederico Vaga.. code-block:: c
964*edba5eecSFederico Vaga
965*edba5eecSFederico Vaga	-*- mode: c -*-
966*edba5eecSFederico Vaga
967*edba5eecSFederico VagaO come queste:
968*edba5eecSFederico Vaga
969*edba5eecSFederico Vaga.. code-block:: c
970*edba5eecSFederico Vaga
971*edba5eecSFederico Vaga	/*
972*edba5eecSFederico Vaga	Local Variables:
973*edba5eecSFederico Vaga	compile-command: "gcc -DMAGIC_DEBUG_FLAG foo.c"
974*edba5eecSFederico Vaga	End:
975*edba5eecSFederico Vaga	*/
976*edba5eecSFederico Vaga
977*edba5eecSFederico VagaVim interpreta i marcatori come questi:
978*edba5eecSFederico Vaga
979*edba5eecSFederico Vaga.. code-block:: c
980*edba5eecSFederico Vaga
981*edba5eecSFederico Vaga	/* vim:set sw=8 noet */
982*edba5eecSFederico Vaga
983*edba5eecSFederico VagaNon includete nessuna di queste cose nei file sorgenti.  Le persone hanno le
984*edba5eecSFederico Vagaproprie configurazioni personali per l'editor, e i vostri sorgenti non
985*edba5eecSFederico Vagadovrebbero sovrascrivergliele.  Questo vale anche per i marcatori
986*edba5eecSFederico Vagad'indentazione e di modalità d'uso.  Le persone potrebbero aver configurato una
987*edba5eecSFederico Vagamodalità su misura, oppure potrebbero avere qualche altra magia per far
988*edba5eecSFederico Vagafunzionare bene l'indentazione.
989*edba5eecSFederico Vaga
990*edba5eecSFederico Vaga19) Inline assembly
991*edba5eecSFederico Vaga---------------------
992*edba5eecSFederico Vaga
993*edba5eecSFederico VagaNel codice specifico per un'architettura, potreste aver bisogno di codice
994*edba5eecSFederico Vaga*inline assembly* per interfacciarvi col processore o con una funzionalità
995*edba5eecSFederico Vagaspecifica della piattaforma.  Non esitate a farlo quando è necessario.
996*edba5eecSFederico VagaComunque, non usatele gratuitamente quando il C può fare la stessa cosa.
997*edba5eecSFederico VagaPotete e dovreste punzecchiare l'hardware in C quando è possibile.
998*edba5eecSFederico Vaga
999*edba5eecSFederico VagaConsiderate la scrittura di una semplice funzione che racchiude pezzi comuni
1000*edba5eecSFederico Vagadi codice assembler piuttosto che continuare a riscrivere delle piccole
1001*edba5eecSFederico Vagavarianti.  Ricordatevi che l' *inline assembly* può utilizzare i parametri C.
1002*edba5eecSFederico Vaga
1003*edba5eecSFederico VagaIl codice assembler più corposo e non banale dovrebbe andare nei file .S,
1004*edba5eecSFederico Vagacoi rispettivi prototipi C definiti nei file d'intestazione.  I prototipi C
1005*edba5eecSFederico Vagaper le funzioni assembler dovrebbero usare ``asmlinkage``.
1006*edba5eecSFederico Vaga
1007*edba5eecSFederico VagaPotreste aver bisogno di marcare il vostro codice asm come volatile al fine
1008*edba5eecSFederico Vagad'evitare che GCC lo rimuova quando pensa che non ci siano effetti collaterali.
1009*edba5eecSFederico VagaNon c'è sempre bisogno di farlo, e farlo quando non serve limita le
1010*edba5eecSFederico Vagaottimizzazioni.
1011*edba5eecSFederico Vaga
1012*edba5eecSFederico VagaQuando scrivete una singola espressione *inline assembly* contenente più
1013*edba5eecSFederico Vagaistruzioni, mettete ognuna di queste istruzioni in una stringa e riga diversa;
1014*edba5eecSFederico Vagaad eccezione dell'ultima stringa/istruzione, ognuna deve terminare con ``\n\t``
1015*edba5eecSFederico Vagaal fine di allineare correttamente l'assembler che verrà generato:
1016*edba5eecSFederico Vaga
1017*edba5eecSFederico Vaga.. code-block:: c
1018*edba5eecSFederico Vaga
1019*edba5eecSFederico Vaga	asm ("magic %reg1, #42\n\t"
1020*edba5eecSFederico Vaga	     "more_magic %reg2, %reg3"
1021*edba5eecSFederico Vaga	     : /* outputs */ : /* inputs */ : /* clobbers */);
1022*edba5eecSFederico Vaga
1023*edba5eecSFederico Vaga20) Compilazione sotto condizione
1024*edba5eecSFederico Vaga---------------------------------
1025*edba5eecSFederico Vaga
1026*edba5eecSFederico VagaOvunque sia possibile, non usate le direttive condizionali del preprocessore
1027*edba5eecSFederico Vaga(#if, #ifdef) nei file .c; farlo rende il codice difficile da leggere e da
1028*edba5eecSFederico Vagaseguire.  Invece, usate queste direttive nei file d'intestazione per definire
1029*edba5eecSFederico Vagale funzioni usate nei file .c, fornendo i relativi stub nel caso #else,
1030*edba5eecSFederico Vagae quindi chiamate queste funzioni senza condizioni di preprocessore.  Il
1031*edba5eecSFederico Vagacompilatore non produrrà alcun codice per le funzioni stub, produrrà gli
1032*edba5eecSFederico Vagastessi risultati, e la logica rimarrà semplice da seguire.
1033*edba5eecSFederico Vaga
1034*edba5eecSFederico VagaÈ preferibile non compilare intere funzioni piuttosto che porzioni d'esse o
1035*edba5eecSFederico Vagaporzioni d'espressioni.  Piuttosto che mettere una ifdef in un'espressione,
1036*edba5eecSFederico Vagafattorizzate parte dell'espressione, o interamente, in funzioni e applicate
1037*edba5eecSFederico Vagala direttiva condizionale su di esse.
1038*edba5eecSFederico Vaga
1039*edba5eecSFederico VagaSe avete una variabile o funzione che potrebbe non essere usata in alcune
1040*edba5eecSFederico Vagaconfigurazioni, e quindi il compilatore potrebbe avvisarvi circa la definizione
1041*edba5eecSFederico Vagainutilizzata, marcate questa definizione come __maybe_used piuttosto che
1042*edba5eecSFederico Vagaracchiuderla in una direttiva condizionale del preprocessore.  (Comunque,
1043*edba5eecSFederico Vagase una variabile o funzione è *sempre* inutilizzata, rimuovetela).
1044*edba5eecSFederico Vaga
1045*edba5eecSFederico VagaNel codice, dov'è possibile, usate la macro IS_ENABLED per convertire i
1046*edba5eecSFederico Vagasimboli Kconfig in espressioni booleane C, e quindi usatela nelle classiche
1047*edba5eecSFederico Vagacondizioni C:
1048*edba5eecSFederico Vaga
1049*edba5eecSFederico Vaga.. code-block:: c
1050*edba5eecSFederico Vaga
1051*edba5eecSFederico Vaga	if (IS_ENABLED(CONFIG_SOMETHING)) {
1052*edba5eecSFederico Vaga		...
1053*edba5eecSFederico Vaga	}
1054*edba5eecSFederico Vaga
1055*edba5eecSFederico VagaIl compilatore valuterà la condizione come costante (constant-fold), e quindi
1056*edba5eecSFederico Vagaincluderà o escluderà il blocco di codice come se fosse in un #ifdef, quindi
1057*edba5eecSFederico Vaganon ne aumenterà il tempo di esecuzione.  Tuttavia, questo permette al
1058*edba5eecSFederico Vagacompilatore C di vedere il codice nel blocco condizionale e verificarne la
1059*edba5eecSFederico Vagacorrettezza (sintassi, tipi, riferimenti ai simboli, eccetera).  Quindi
1060*edba5eecSFederico Vagadovete comunque utilizzare #ifdef se il codice nel blocco condizionale esiste
1061*edba5eecSFederico Vagasolo quando la condizione è soddisfatta.
1062*edba5eecSFederico Vaga
1063*edba5eecSFederico VagaAlla fine di un blocco corposo di #if o #ifdef (più di alcune linee),
1064*edba5eecSFederico Vagamettete un commento sulla stessa riga di #endif, annotando la condizione
1065*edba5eecSFederico Vagache termina.  Per esempio:
1066*edba5eecSFederico Vaga
1067*edba5eecSFederico Vaga.. code-block:: c
1068*edba5eecSFederico Vaga
1069*edba5eecSFederico Vaga	#ifdef CONFIG_SOMETHING
1070*edba5eecSFederico Vaga	...
1071*edba5eecSFederico Vaga	#endif /* CONFIG_SOMETHING */
1072*edba5eecSFederico Vaga
1073*edba5eecSFederico VagaAppendice I) riferimenti
1074*edba5eecSFederico Vaga------------------------
1075*edba5eecSFederico Vaga
1076*edba5eecSFederico VagaThe C Programming Language, Second Edition
1077*edba5eecSFederico Vagaby Brian W. Kernighan and Dennis M. Ritchie.
1078*edba5eecSFederico VagaPrentice Hall, Inc., 1988.
1079*edba5eecSFederico VagaISBN 0-13-110362-8 (paperback), 0-13-110370-9 (hardback).
1080*edba5eecSFederico Vaga
1081*edba5eecSFederico VagaThe Practice of Programming
1082*edba5eecSFederico Vagaby Brian W. Kernighan and Rob Pike.
1083*edba5eecSFederico VagaAddison-Wesley, Inc., 1999.
1084*edba5eecSFederico VagaISBN 0-201-61586-X.
1085*edba5eecSFederico Vaga
1086*edba5eecSFederico VagaManuali GNU - nei casi in cui sono compatibili con K&R e questo documento -
1087*edba5eecSFederico Vagaper indent, cpp, gcc e i suoi dettagli interni, tutto disponibile qui
1088*edba5eecSFederico Vagahttp://www.gnu.org/manual/
1089*edba5eecSFederico Vaga
1090*edba5eecSFederico VagaWG14 è il gruppo internazionale di standardizzazione per il linguaggio C,
1091*edba5eecSFederico VagaURL: http://www.open-std.org/JTC1/SC22/WG14/
1092*edba5eecSFederico Vaga
1093*edba5eecSFederico VagaKernel process/coding-style.rst, by greg@kroah.com at OLS 2002:
1094*edba5eecSFederico Vagahttp://www.kroah.com/linux/talks/ols_2002_kernel_codingstyle_talk/html/
1095