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