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