xref: /OK3568_Linux_fs/kernel/Documentation/translations/it_IT/process/coding-style.rst (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun.. include:: ../disclaimer-ita.rst
2*4882a593Smuzhiyun
3*4882a593Smuzhiyun:Original: :ref:`Documentation/process/coding-style.rst <codingstyle>`
4*4882a593Smuzhiyun:Translator: Federico Vaga <federico.vaga@vaga.pv.it>
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun.. _it_codingstyle:
7*4882a593Smuzhiyun
8*4882a593SmuzhiyunStile del codice per il kernel Linux
9*4882a593Smuzhiyun====================================
10*4882a593Smuzhiyun
11*4882a593SmuzhiyunQuesto è un breve documento che descrive lo stile di codice preferito per
12*4882a593Smuzhiyunil kernel Linux.  Lo stile di codifica è molto personale e non voglio
13*4882a593Smuzhiyun**forzare** nessuno ad accettare il mio, ma questo stile è quello che
14*4882a593Smuzhiyundev'essere usato per qualsiasi cosa che io sia in grado di mantenere, e l'ho
15*4882a593Smuzhiyunpreferito anche per molte altre cose.  Per favore, almeno tenete in
16*4882a593Smuzhiyunconsiderazione le osservazioni espresse qui.
17*4882a593Smuzhiyun
18*4882a593SmuzhiyunLa prima cosa che suggerisco è quella di stamparsi una copia degli standard
19*4882a593Smuzhiyundi codifica GNU e di NON leggerla.  Bruciatela, è un grande gesto simbolico.
20*4882a593Smuzhiyun
21*4882a593SmuzhiyunComunque, ecco i punti:
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun1) Indentazione
24*4882a593Smuzhiyun---------------
25*4882a593Smuzhiyun
26*4882a593SmuzhiyunLa tabulazione (tab) è di 8 caratteri e così anche le indentazioni. Ci sono
27*4882a593Smuzhiyunalcuni movimenti di eretici che vorrebbero l'indentazione a 4 (o perfino 2!)
28*4882a593Smuzhiyuncaratteri di profondità, che è simile al tentativo di definire il valore del
29*4882a593Smuzhiyunpi-greco a 3.
30*4882a593Smuzhiyun
31*4882a593SmuzhiyunMotivazione: l'idea dell'indentazione è di definire chiaramente dove un blocco
32*4882a593Smuzhiyundi controllo inizia e finisce.  Specialmente quando siete rimasti a guardare lo
33*4882a593Smuzhiyunschermo per 20 ore a file, troverete molto più facile capire i livelli di
34*4882a593Smuzhiyunindentazione se questi sono larghi.
35*4882a593Smuzhiyun
36*4882a593SmuzhiyunOra, alcuni rivendicano che un'indentazione da 8 caratteri sposta il codice
37*4882a593Smuzhiyuntroppo a destra e che quindi rende difficile la lettura su schermi a 80
38*4882a593Smuzhiyuncaratteri.  La risposta a questa affermazione è che se vi servono più di 3
39*4882a593Smuzhiyunlivelli di indentazione, siete comunque fregati e dovreste correggere il vostro
40*4882a593Smuzhiyunprogramma.
41*4882a593Smuzhiyun
42*4882a593SmuzhiyunIn breve, l'indentazione ad 8 caratteri rende più facile la lettura, e in
43*4882a593Smuzhiyunaggiunta vi avvisa quando state annidando troppo le vostre funzioni.
44*4882a593SmuzhiyunTenete ben a mente questo avviso.
45*4882a593Smuzhiyun
46*4882a593SmuzhiyunAl fine di facilitare l'indentazione del costrutto switch, si preferisce
47*4882a593Smuzhiyunallineare sulla stessa colonna la parola chiave ``switch`` e i suoi
48*4882a593Smuzhiyunsubordinati ``case``. In questo modo si evita una doppia indentazione per
49*4882a593Smuzhiyuni ``case``.  Un esempio.:
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun.. code-block:: c
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun	switch (suffix) {
54*4882a593Smuzhiyun	case 'G':
55*4882a593Smuzhiyun	case 'g':
56*4882a593Smuzhiyun		mem <<= 30;
57*4882a593Smuzhiyun		break;
58*4882a593Smuzhiyun	case 'M':
59*4882a593Smuzhiyun	case 'm':
60*4882a593Smuzhiyun		mem <<= 20;
61*4882a593Smuzhiyun		break;
62*4882a593Smuzhiyun	case 'K':
63*4882a593Smuzhiyun	case 'k':
64*4882a593Smuzhiyun		mem <<= 10;
65*4882a593Smuzhiyun		/* fall through */
66*4882a593Smuzhiyun	default:
67*4882a593Smuzhiyun		break;
68*4882a593Smuzhiyun	}
69*4882a593Smuzhiyun
70*4882a593SmuzhiyunA meno che non vogliate nascondere qualcosa, non mettete più istruzioni sulla
71*4882a593Smuzhiyunstessa riga:
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun.. code-block:: c
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun	if (condition) do_this;
76*4882a593Smuzhiyun	  do_something_everytime;
77*4882a593Smuzhiyun
78*4882a593Smuzhiyunné mettete più assegnamenti sulla stessa riga.  Lo stile del kernel
79*4882a593Smuzhiyunè ultrasemplice.  Evitate espressioni intricate.
80*4882a593Smuzhiyun
81*4882a593SmuzhiyunAl di fuori dei commenti, della documentazione ed escludendo i Kconfig, gli
82*4882a593Smuzhiyunspazi non vengono mai usati per l'indentazione, e l'esempio qui sopra è
83*4882a593Smuzhiyunvolutamente errato.
84*4882a593Smuzhiyun
85*4882a593SmuzhiyunProcuratevi un buon editor di testo e non lasciate spazi bianchi alla fine
86*4882a593Smuzhiyundelle righe.
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun2) Spezzare righe lunghe e stringhe
90*4882a593Smuzhiyun-----------------------------------
91*4882a593Smuzhiyun
92*4882a593SmuzhiyunLo stile del codice riguarda la leggibilità e la manutenibilità utilizzando
93*4882a593Smuzhiyunstrumenti comuni.
94*4882a593Smuzhiyun
95*4882a593SmuzhiyunIl limite delle righe è di 80 colonne e questo e un limite fortemente
96*4882a593Smuzhiyundesiderato.
97*4882a593Smuzhiyun
98*4882a593SmuzhiyunEspressioni più lunghe di 80 colonne saranno spezzettate in pezzi più piccoli,
99*4882a593Smuzhiyuna meno che eccedere le 80 colonne non aiuti ad aumentare la leggibilità senza
100*4882a593Smuzhiyunnascondere informazioni.  I pezzi derivati sono sostanzialmente più corti degli
101*4882a593Smuzhiyunoriginali e vengono posizionati più a destra.  Lo stesso si applica, nei file
102*4882a593Smuzhiyund'intestazione, alle funzioni con una lista di argomenti molto lunga. Tuttavia,
103*4882a593Smuzhiyunnon spezzettate mai le stringhe visibili agli utenti come i messaggi di
104*4882a593Smuzhiyunprintk, questo perché inibireste la possibilità d'utilizzare grep per cercarle.
105*4882a593Smuzhiyun
106*4882a593Smuzhiyun3) Posizionamento di parentesi graffe e spazi
107*4882a593Smuzhiyun---------------------------------------------
108*4882a593Smuzhiyun
109*4882a593SmuzhiyunUn altro problema che s'affronta sempre quando si parla di stile in C è
110*4882a593Smuzhiyunil posizionamento delle parentesi graffe.  Al contrario della dimensione
111*4882a593Smuzhiyundell'indentazione, non ci sono motivi tecnici sulla base dei quali scegliere
112*4882a593Smuzhiyununa strategia di posizionamento o un'altra; ma il modo qui preferito,
113*4882a593Smuzhiyuncome mostratoci dai profeti Kernighan e Ritchie, è quello di
114*4882a593Smuzhiyunposizionare la parentesi graffa di apertura per ultima sulla riga, e quella
115*4882a593Smuzhiyundi chiusura per prima su una nuova riga, così:
116*4882a593Smuzhiyun
117*4882a593Smuzhiyun.. code-block:: c
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun	if (x is true) {
120*4882a593Smuzhiyun		we do y
121*4882a593Smuzhiyun	}
122*4882a593Smuzhiyun
123*4882a593SmuzhiyunQuesto è valido per tutte le espressioni che non siano funzioni (if, switch,
124*4882a593Smuzhiyunfor, while, do).  Per esempio:
125*4882a593Smuzhiyun
126*4882a593Smuzhiyun.. code-block:: c
127*4882a593Smuzhiyun
128*4882a593Smuzhiyun	switch (action) {
129*4882a593Smuzhiyun	case KOBJ_ADD:
130*4882a593Smuzhiyun		return "add";
131*4882a593Smuzhiyun	case KOBJ_REMOVE:
132*4882a593Smuzhiyun		return "remove";
133*4882a593Smuzhiyun	case KOBJ_CHANGE:
134*4882a593Smuzhiyun		return "change";
135*4882a593Smuzhiyun	default:
136*4882a593Smuzhiyun		return NULL;
137*4882a593Smuzhiyun	}
138*4882a593Smuzhiyun
139*4882a593SmuzhiyunTuttavia, c'è il caso speciale, le funzioni: queste hanno la parentesi graffa
140*4882a593Smuzhiyundi apertura all'inizio della riga successiva, quindi:
141*4882a593Smuzhiyun
142*4882a593Smuzhiyun.. code-block:: c
143*4882a593Smuzhiyun
144*4882a593Smuzhiyun	int function(int x)
145*4882a593Smuzhiyun	{
146*4882a593Smuzhiyun		body of function
147*4882a593Smuzhiyun	}
148*4882a593Smuzhiyun
149*4882a593SmuzhiyunEretici da tutto il mondo affermano che questa incoerenza è ...
150*4882a593Smuzhiyuninsomma ... incoerente, ma tutte le persone ragionevoli sanno che (a)
151*4882a593SmuzhiyunK&R hanno **ragione** e (b) K&R hanno ragione.  A parte questo, le funzioni
152*4882a593Smuzhiyunsono comunque speciali (non potete annidarle in C).
153*4882a593Smuzhiyun
154*4882a593SmuzhiyunNotate che la graffa di chiusura è da sola su una riga propria, ad
155*4882a593Smuzhiyun**eccezione** di quei casi dove è seguita dalla continuazione della stessa
156*4882a593Smuzhiyunespressione, in pratica ``while`` nell'espressione do-while, oppure ``else``
157*4882a593Smuzhiyunnell'espressione if-else, come questo:
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun.. code-block:: c
160*4882a593Smuzhiyun
161*4882a593Smuzhiyun	do {
162*4882a593Smuzhiyun		body of do-loop
163*4882a593Smuzhiyun	} while (condition);
164*4882a593Smuzhiyun
165*4882a593Smuzhiyune
166*4882a593Smuzhiyun
167*4882a593Smuzhiyun.. code-block:: c
168*4882a593Smuzhiyun
169*4882a593Smuzhiyun	if (x == y) {
170*4882a593Smuzhiyun		..
171*4882a593Smuzhiyun	} else if (x > y) {
172*4882a593Smuzhiyun		...
173*4882a593Smuzhiyun	} else {
174*4882a593Smuzhiyun		....
175*4882a593Smuzhiyun	}
176*4882a593Smuzhiyun
177*4882a593SmuzhiyunMotivazione: K&R.
178*4882a593Smuzhiyun
179*4882a593SmuzhiyunInoltre, notate che questo posizionamento delle graffe minimizza il numero
180*4882a593Smuzhiyundi righe vuote senza perdere di leggibilità.  In questo modo, dato che le
181*4882a593Smuzhiyunrighe sul vostro schermo non sono una risorsa illimitata (pensate ad uno
182*4882a593Smuzhiyunterminale con 25 righe), avrete delle righe vuote da riempire con dei
183*4882a593Smuzhiyuncommenti.
184*4882a593Smuzhiyun
185*4882a593SmuzhiyunNon usate inutilmente le graffe dove una singola espressione è sufficiente.
186*4882a593Smuzhiyun
187*4882a593Smuzhiyun.. code-block:: c
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun	if (condition)
190*4882a593Smuzhiyun		action();
191*4882a593Smuzhiyun
192*4882a593Smuzhiyune
193*4882a593Smuzhiyun
194*4882a593Smuzhiyun.. code-block:: none
195*4882a593Smuzhiyun
196*4882a593Smuzhiyun	if (condition)
197*4882a593Smuzhiyun		do_this();
198*4882a593Smuzhiyun	else
199*4882a593Smuzhiyun		do_that();
200*4882a593Smuzhiyun
201*4882a593SmuzhiyunQuesto non vale nel caso in cui solo un ramo dell'espressione if-else
202*4882a593Smuzhiyuncontiene una sola espressione; in quest'ultimo caso usate le graffe per
203*4882a593Smuzhiyunentrambe i rami:
204*4882a593Smuzhiyun
205*4882a593Smuzhiyun.. code-block:: c
206*4882a593Smuzhiyun
207*4882a593Smuzhiyun	if (condition) {
208*4882a593Smuzhiyun		do_this();
209*4882a593Smuzhiyun		do_that();
210*4882a593Smuzhiyun	} else {
211*4882a593Smuzhiyun		otherwise();
212*4882a593Smuzhiyun	}
213*4882a593Smuzhiyun
214*4882a593SmuzhiyunInoltre, usate le graffe se un ciclo contiene più di una semplice istruzione:
215*4882a593Smuzhiyun
216*4882a593Smuzhiyun.. code-block:: c
217*4882a593Smuzhiyun
218*4882a593Smuzhiyun	while (condition) {
219*4882a593Smuzhiyun		if (test)
220*4882a593Smuzhiyun			do_something();
221*4882a593Smuzhiyun	}
222*4882a593Smuzhiyun
223*4882a593Smuzhiyun3.1) Spazi
224*4882a593Smuzhiyun**********
225*4882a593Smuzhiyun
226*4882a593SmuzhiyunLo stile del kernel Linux per quanto riguarda gli spazi, dipende
227*4882a593Smuzhiyun(principalmente) dalle funzioni e dalle parole chiave.  Usate una spazio dopo
228*4882a593Smuzhiyun(quasi tutte) le parole chiave.  L'eccezioni più evidenti sono sizeof, typeof,
229*4882a593Smuzhiyunalignof, e __attribute__, il cui aspetto è molto simile a quello delle
230*4882a593Smuzhiyunfunzioni (e in Linux, solitamente, sono usate con le parentesi, anche se il
231*4882a593Smuzhiyunlinguaggio non lo richiede; come ``sizeof info`` dopo aver dichiarato
232*4882a593Smuzhiyun``struct fileinfo info``).
233*4882a593Smuzhiyun
234*4882a593SmuzhiyunQuindi utilizzate uno spazio dopo le seguenti parole chiave::
235*4882a593Smuzhiyun
236*4882a593Smuzhiyun	if, switch, case, for, do, while
237*4882a593Smuzhiyun
238*4882a593Smuzhiyunma non con sizeof, typeof, alignof, o __attribute__.  Ad esempio,
239*4882a593Smuzhiyun
240*4882a593Smuzhiyun.. code-block:: c
241*4882a593Smuzhiyun
242*4882a593Smuzhiyun
243*4882a593Smuzhiyun	s = sizeof(struct file);
244*4882a593Smuzhiyun
245*4882a593SmuzhiyunNon aggiungete spazi attorno (dentro) ad un'espressione fra parentesi. Questo
246*4882a593Smuzhiyunesempio è **brutto**:
247*4882a593Smuzhiyun
248*4882a593Smuzhiyun.. code-block:: c
249*4882a593Smuzhiyun
250*4882a593Smuzhiyun
251*4882a593Smuzhiyun	s = sizeof( struct file );
252*4882a593Smuzhiyun
253*4882a593SmuzhiyunQuando dichiarate un puntatore ad una variabile o una funzione che ritorna un
254*4882a593Smuzhiyunpuntatore, il posto suggerito per l'asterisco ``*`` è adiacente al nome della
255*4882a593Smuzhiyunvariabile o della funzione, e non adiacente al nome del tipo. Esempi:
256*4882a593Smuzhiyun
257*4882a593Smuzhiyun.. code-block:: c
258*4882a593Smuzhiyun
259*4882a593Smuzhiyun
260*4882a593Smuzhiyun	char *linux_banner;
261*4882a593Smuzhiyun	unsigned long long memparse(char *ptr, char **retptr);
262*4882a593Smuzhiyun	char *match_strdup(substring_t *s);
263*4882a593Smuzhiyun
264*4882a593SmuzhiyunUsate uno spazio attorno (da ogni parte) alla maggior parte degli operatori
265*4882a593Smuzhiyunbinari o ternari, come i seguenti::
266*4882a593Smuzhiyun
267*4882a593Smuzhiyun	=  +  -  <  >  *  /  %  |  &  ^  <=  >=  ==  !=  ?  :
268*4882a593Smuzhiyun
269*4882a593Smuzhiyunma non mettete spazi dopo gli operatori unari::
270*4882a593Smuzhiyun
271*4882a593Smuzhiyun	&  *  +  -  ~  !  sizeof  typeof  alignof  __attribute__  defined
272*4882a593Smuzhiyun
273*4882a593Smuzhiyunnessuno spazio dopo l'operatore unario suffisso di incremento o decremento::
274*4882a593Smuzhiyun
275*4882a593Smuzhiyun	++  --
276*4882a593Smuzhiyun
277*4882a593Smuzhiyunnessuno spazio dopo l'operatore unario prefisso di incremento o decremento::
278*4882a593Smuzhiyun
279*4882a593Smuzhiyun	++  --
280*4882a593Smuzhiyun
281*4882a593Smuzhiyune nessuno spazio attorno agli operatori dei membri di una struttura ``.`` e
282*4882a593Smuzhiyun``->``.
283*4882a593Smuzhiyun
284*4882a593SmuzhiyunNon lasciate spazi bianchi alla fine delle righe.  Alcuni editor con
285*4882a593Smuzhiyunl'indentazione ``furba`` inseriranno gli spazi bianchi all'inizio di una nuova
286*4882a593Smuzhiyunriga in modo appropriato, quindi potrete scrivere la riga di codice successiva
287*4882a593Smuzhiyunimmediatamente.  Tuttavia, alcuni di questi stessi editor non rimuovono
288*4882a593Smuzhiyunquesti spazi bianchi quando non scrivete nulla sulla nuova riga, ad esempio
289*4882a593Smuzhiyunperché volete lasciare una riga vuota.  Il risultato è che finirete per avere
290*4882a593Smuzhiyundelle righe che contengono spazi bianchi in coda.
291*4882a593Smuzhiyun
292*4882a593SmuzhiyunGit vi avviserà delle modifiche che aggiungono questi spazi vuoti di fine riga,
293*4882a593Smuzhiyune può opzionalmente rimuoverli per conto vostro; tuttavia, se state applicando
294*4882a593Smuzhiyununa serie di modifiche, questo potrebbe far fallire delle modifiche successive
295*4882a593Smuzhiyunperché il contesto delle righe verrà cambiato.
296*4882a593Smuzhiyun
297*4882a593Smuzhiyun4) Assegnare nomi
298*4882a593Smuzhiyun-----------------
299*4882a593Smuzhiyun
300*4882a593SmuzhiyunC è un linguaggio spartano, e così dovrebbero esserlo i vostri nomi.  Al
301*4882a593Smuzhiyuncontrario dei programmatori Modula-2 o Pascal, i programmatori C non usano
302*4882a593Smuzhiyunnomi graziosi come ThisVariableIsATemporaryCounter.  Un programmatore C
303*4882a593Smuzhiyunchiamerebbe questa variabile ``tmp``, che è molto più facile da scrivere e
304*4882a593Smuzhiyunnon è una delle più difficili da capire.
305*4882a593Smuzhiyun
306*4882a593SmuzhiyunTUTTAVIA, nonostante i nomi con notazione mista siano da condannare, i nomi
307*4882a593Smuzhiyundescrittivi per variabili globali sono un dovere.  Chiamare una funzione
308*4882a593Smuzhiyunglobale ``pippo`` è un insulto.
309*4882a593Smuzhiyun
310*4882a593SmuzhiyunLe variabili GLOBALI (da usare solo se vi servono **davvero**) devono avere
311*4882a593Smuzhiyundei nomi descrittivi, così come le funzioni globali.  Se avete una funzione
312*4882a593Smuzhiyunche conta gli utenti attivi, dovreste chiamarla ``count_active_users()`` o
313*4882a593Smuzhiyunqualcosa di simile, **non** dovreste chiamarla ``cntusr()``.
314*4882a593Smuzhiyun
315*4882a593SmuzhiyunCodificare il tipo di funzione nel suo nome (quella cosa chiamata notazione
316*4882a593Smuzhiyunungherese) è stupido - il compilatore conosce comunque il tipo e
317*4882a593Smuzhiyunpuò verificarli, e inoltre confonde i programmatori.  Non c'è da
318*4882a593Smuzhiyunsorprendersi che MicroSoft faccia programmi bacati.
319*4882a593Smuzhiyun
320*4882a593SmuzhiyunLe variabili LOCALI dovrebbero avere nomi corti, e significativi.  Se avete
321*4882a593Smuzhiyunun qualsiasi contatore di ciclo, probabilmente sarà chiamato ``i``.
322*4882a593SmuzhiyunChiamarlo ``loop_counter`` non è produttivo, non ci sono possibilità che
323*4882a593Smuzhiyun``i`` possa non essere capito.  Analogamente, ``tmp`` può essere una qualsiasi
324*4882a593Smuzhiyunvariabile che viene usata per salvare temporaneamente un valore.
325*4882a593Smuzhiyun
326*4882a593SmuzhiyunSe avete paura di fare casino coi nomi delle vostre variabili locali, allora
327*4882a593Smuzhiyunavete un altro problema che è chiamato sindrome dello squilibrio dell'ormone
328*4882a593Smuzhiyundella crescita delle funzioni. Vedere il capitolo 6 (funzioni).
329*4882a593Smuzhiyun
330*4882a593Smuzhiyun5) Definizione di tipi (typedef)
331*4882a593Smuzhiyun--------------------------------
332*4882a593Smuzhiyun
333*4882a593SmuzhiyunPer favore non usate cose come ``vps_t``.
334*4882a593SmuzhiyunUsare il typedef per strutture e puntatori è uno **sbaglio**. Quando vedete:
335*4882a593Smuzhiyun
336*4882a593Smuzhiyun.. code-block:: c
337*4882a593Smuzhiyun
338*4882a593Smuzhiyun	vps_t a;
339*4882a593Smuzhiyun
340*4882a593Smuzhiyunnei sorgenti, cosa significa?
341*4882a593SmuzhiyunSe, invece, dicesse:
342*4882a593Smuzhiyun
343*4882a593Smuzhiyun.. code-block:: c
344*4882a593Smuzhiyun
345*4882a593Smuzhiyun	struct virtual_container *a;
346*4882a593Smuzhiyun
347*4882a593Smuzhiyunpotreste dire cos'è effettivamente ``a``.
348*4882a593Smuzhiyun
349*4882a593SmuzhiyunMolte persone pensano che la definizione dei tipi ``migliori la leggibilità``.
350*4882a593SmuzhiyunNon molto. Sono utili per:
351*4882a593Smuzhiyun
352*4882a593Smuzhiyun (a) gli oggetti completamente opachi (dove typedef viene proprio usato allo
353*4882a593Smuzhiyun     scopo di **nascondere** cosa sia davvero l'oggetto).
354*4882a593Smuzhiyun
355*4882a593Smuzhiyun     Esempio: ``pte_t`` eccetera sono oggetti opachi che potete usare solamente
356*4882a593Smuzhiyun     con le loro funzioni accessorie.
357*4882a593Smuzhiyun
358*4882a593Smuzhiyun     .. note::
359*4882a593Smuzhiyun       Gli oggetti opachi e le ``funzioni accessorie`` non sono, di per se,
360*4882a593Smuzhiyun       una bella cosa. Il motivo per cui abbiamo cose come pte_t eccetera è
361*4882a593Smuzhiyun       che davvero non c'è alcuna informazione portabile.
362*4882a593Smuzhiyun
363*4882a593Smuzhiyun (b) i tipi chiaramente interi, dove l'astrazione **aiuta** ad evitare
364*4882a593Smuzhiyun     confusione sul fatto che siano ``int`` oppure ``long``.
365*4882a593Smuzhiyun
366*4882a593Smuzhiyun     u8/u16/u32 sono typedef perfettamente accettabili, anche se ricadono
367*4882a593Smuzhiyun     nella categoria (d) piuttosto che in questa.
368*4882a593Smuzhiyun
369*4882a593Smuzhiyun     .. note::
370*4882a593Smuzhiyun
371*4882a593Smuzhiyun       Ancora - dev'esserci una **ragione** per farlo. Se qualcosa è
372*4882a593Smuzhiyun       ``unsigned long``, non c'è alcun bisogno di avere:
373*4882a593Smuzhiyun
374*4882a593Smuzhiyun        typedef unsigned long myfalgs_t;
375*4882a593Smuzhiyun
376*4882a593Smuzhiyun      ma se ci sono chiare circostanze in cui potrebbe essere ``unsigned int``
377*4882a593Smuzhiyun      e in altre configurazioni ``unsigned long``, allora certamente typedef
378*4882a593Smuzhiyun      è una buona scelta.
379*4882a593Smuzhiyun
380*4882a593Smuzhiyun (c) quando di rado create letteralmente dei **nuovi** tipi su cui effettuare
381*4882a593Smuzhiyun     verifiche.
382*4882a593Smuzhiyun
383*4882a593Smuzhiyun (d) circostanze eccezionali, in cui si definiscono nuovi tipi identici a
384*4882a593Smuzhiyun     quelli definiti dallo standard C99.
385*4882a593Smuzhiyun
386*4882a593Smuzhiyun     Nonostante ci voglia poco tempo per abituare occhi e cervello all'uso dei
387*4882a593Smuzhiyun     tipi standard come ``uint32_t``, alcune persone ne obiettano l'uso.
388*4882a593Smuzhiyun
389*4882a593Smuzhiyun     Perciò, i tipi specifici di Linux ``u8/u16/u32/u64`` e i loro equivalenti
390*4882a593Smuzhiyun     con segno, identici ai tipi standard, sono permessi- tuttavia, non sono
391*4882a593Smuzhiyun     obbligatori per il nuovo codice.
392*4882a593Smuzhiyun
393*4882a593Smuzhiyun (e) i tipi sicuri nella spazio utente.
394*4882a593Smuzhiyun
395*4882a593Smuzhiyun     In alcune strutture dati visibili dallo spazio utente non possiamo
396*4882a593Smuzhiyun     richiedere l'uso dei tipi C99 e nemmeno i vari ``u32`` descritti prima.
397*4882a593Smuzhiyun     Perciò, utilizziamo __u32 e tipi simili in tutte le strutture dati
398*4882a593Smuzhiyun     condivise con lo spazio utente.
399*4882a593Smuzhiyun
400*4882a593SmuzhiyunMagari ci sono altri casi validi, ma la regola di base dovrebbe essere di
401*4882a593Smuzhiyunnon usare MAI MAI un typedef a meno che non rientri in una delle regole
402*4882a593Smuzhiyundescritte qui.
403*4882a593Smuzhiyun
404*4882a593SmuzhiyunIn generale, un puntatore, o una struttura a cui si ha accesso diretto in
405*4882a593Smuzhiyunmodo ragionevole, non dovrebbero **mai** essere definite con un typedef.
406*4882a593Smuzhiyun
407*4882a593Smuzhiyun6) Funzioni
408*4882a593Smuzhiyun-----------
409*4882a593Smuzhiyun
410*4882a593SmuzhiyunLe funzioni dovrebbero essere brevi e carine, e fare una cosa sola.  Dovrebbero
411*4882a593Smuzhiyunoccupare uno o due schermi di testo (come tutti sappiamo, la dimensione
412*4882a593Smuzhiyundi uno schermo secondo ISO/ANSI è di 80x24), e fare una cosa sola e bene.
413*4882a593Smuzhiyun
414*4882a593SmuzhiyunLa massima lunghezza di una funziona è inversamente proporzionale alla sua
415*4882a593Smuzhiyuncomplessità e al livello di indentazione di quella funzione.  Quindi, se avete
416*4882a593Smuzhiyununa funzione che è concettualmente semplice ma che è implementata come un
417*4882a593Smuzhiyunlunga (ma semplice) sequenza di caso-istruzione, dove avete molte piccole cose
418*4882a593Smuzhiyunper molti casi differenti, allora va bene avere funzioni più lunghe.
419*4882a593Smuzhiyun
420*4882a593SmuzhiyunComunque, se avete una funzione complessa e sospettate che uno studente
421*4882a593Smuzhiyunnon particolarmente dotato del primo anno delle scuole superiori potrebbe
422*4882a593Smuzhiyunnon capire cosa faccia la funzione, allora dovreste attenervi strettamente ai
423*4882a593Smuzhiyunlimiti.  Usate funzioni di supporto con nomi descrittivi (potete chiedere al
424*4882a593Smuzhiyuncompilatore di renderle inline se credete che sia necessario per le
425*4882a593Smuzhiyunprestazioni, e probabilmente farà un lavoro migliore di quanto avreste potuto
426*4882a593Smuzhiyunfare voi).
427*4882a593Smuzhiyun
428*4882a593SmuzhiyunUn'altra misura delle funzioni sono il numero di variabili locali.  Non
429*4882a593Smuzhiyundovrebbero eccedere le 5-10, oppure state sbagliando qualcosa.  Ripensate la
430*4882a593Smuzhiyunfunzione, e dividetela in pezzettini.  Generalmente, un cervello umano può
431*4882a593Smuzhiyunseguire facilmente circa 7 cose diverse, di più lo confonderebbe.  Lo sai
432*4882a593Smuzhiyund'essere brillante, ma magari vorresti riuscire a capire cos'avevi fatto due
433*4882a593Smuzhiyunsettimane prima.
434*4882a593Smuzhiyun
435*4882a593SmuzhiyunNei file sorgenti, separate le funzioni con una riga vuota.  Se la funzione è
436*4882a593Smuzhiyunesportata, la macro **EXPORT** per questa funzione deve seguire immediatamente
437*4882a593Smuzhiyunla riga della parentesi graffa di chiusura. Ad esempio:
438*4882a593Smuzhiyun
439*4882a593Smuzhiyun.. code-block:: c
440*4882a593Smuzhiyun
441*4882a593Smuzhiyun	int system_is_up(void)
442*4882a593Smuzhiyun	{
443*4882a593Smuzhiyun		return system_state == SYSTEM_RUNNING;
444*4882a593Smuzhiyun	}
445*4882a593Smuzhiyun	EXPORT_SYMBOL(system_is_up);
446*4882a593Smuzhiyun
447*4882a593SmuzhiyunNei prototipi di funzione, includete i nomi dei parametri e i loro tipi.
448*4882a593SmuzhiyunNonostante questo non sia richiesto dal linguaggio C, in Linux viene preferito
449*4882a593Smuzhiyunperché è un modo semplice per aggiungere informazioni importanti per il
450*4882a593Smuzhiyunlettore.
451*4882a593Smuzhiyun
452*4882a593SmuzhiyunNon usate la parola chiave ``extern`` coi prototipi di funzione perché
453*4882a593Smuzhiyunrende le righe più lunghe e non è strettamente necessario.
454*4882a593Smuzhiyun
455*4882a593Smuzhiyun7) Centralizzare il ritorno delle funzioni
456*4882a593Smuzhiyun------------------------------------------
457*4882a593Smuzhiyun
458*4882a593SmuzhiyunSebbene sia deprecata da molte persone, l'istruzione goto è impiegata di
459*4882a593Smuzhiyunfrequente dai compilatori sotto forma di salto incondizionato.
460*4882a593Smuzhiyun
461*4882a593SmuzhiyunL'istruzione goto diventa utile quando una funzione ha punti d'uscita multipli
462*4882a593Smuzhiyune vanno eseguite alcune procedure di pulizia in comune.  Se non è necessario
463*4882a593Smuzhiyunpulire alcunché, allora ritornate direttamente.
464*4882a593Smuzhiyun
465*4882a593SmuzhiyunAssegnate un nome all'etichetta di modo che suggerisca cosa fa la goto o
466*4882a593Smuzhiyunperché esiste.  Un esempio di un buon nome potrebbe essere ``out_free_buffer:``
467*4882a593Smuzhiyunse la goto libera (free) un ``buffer``.  Evitate l'uso di nomi GW-BASIC come
468*4882a593Smuzhiyun``err1:`` ed ``err2:``, potreste doverli riordinare se aggiungete o rimuovete
469*4882a593Smuzhiyunpunti d'uscita, e inoltre rende difficile verificarne la correttezza.
470*4882a593Smuzhiyun
471*4882a593SmuzhiyunI motivo per usare le goto sono:
472*4882a593Smuzhiyun
473*4882a593Smuzhiyun- i salti incondizionati sono più facili da capire e seguire
474*4882a593Smuzhiyun- l'annidamento si riduce
475*4882a593Smuzhiyun- si evita di dimenticare, per errore, di aggiornare un singolo punto d'uscita
476*4882a593Smuzhiyun- aiuta il compilatore ad ottimizzare il codice ridondante ;)
477*4882a593Smuzhiyun
478*4882a593Smuzhiyun.. code-block:: c
479*4882a593Smuzhiyun
480*4882a593Smuzhiyun	int fun(int a)
481*4882a593Smuzhiyun	{
482*4882a593Smuzhiyun		int result = 0;
483*4882a593Smuzhiyun		char *buffer;
484*4882a593Smuzhiyun
485*4882a593Smuzhiyun		buffer = kmalloc(SIZE, GFP_KERNEL);
486*4882a593Smuzhiyun		if (!buffer)
487*4882a593Smuzhiyun			return -ENOMEM;
488*4882a593Smuzhiyun
489*4882a593Smuzhiyun		if (condition1) {
490*4882a593Smuzhiyun			while (loop1) {
491*4882a593Smuzhiyun				...
492*4882a593Smuzhiyun			}
493*4882a593Smuzhiyun			result = 1;
494*4882a593Smuzhiyun			goto out_free_buffer;
495*4882a593Smuzhiyun		}
496*4882a593Smuzhiyun		...
497*4882a593Smuzhiyun	out_free_buffer:
498*4882a593Smuzhiyun		kfree(buffer);
499*4882a593Smuzhiyun		return result;
500*4882a593Smuzhiyun	}
501*4882a593Smuzhiyun
502*4882a593SmuzhiyunUn baco abbastanza comune di cui bisogna prendere nota è il ``one err bugs``
503*4882a593Smuzhiyunche assomiglia a questo:
504*4882a593Smuzhiyun
505*4882a593Smuzhiyun.. code-block:: c
506*4882a593Smuzhiyun
507*4882a593Smuzhiyun	err:
508*4882a593Smuzhiyun		kfree(foo->bar);
509*4882a593Smuzhiyun		kfree(foo);
510*4882a593Smuzhiyun		return ret;
511*4882a593Smuzhiyun
512*4882a593SmuzhiyunIl baco in questo codice è che in alcuni punti d'uscita la variabile ``foo`` è
513*4882a593SmuzhiyunNULL.  Normalmente si corregge questo baco dividendo la gestione dell'errore in
514*4882a593Smuzhiyundue parti ``err_free_bar:`` e ``err_free_foo:``:
515*4882a593Smuzhiyun
516*4882a593Smuzhiyun.. code-block:: c
517*4882a593Smuzhiyun
518*4882a593Smuzhiyun	 err_free_bar:
519*4882a593Smuzhiyun		kfree(foo->bar);
520*4882a593Smuzhiyun	 err_free_foo:
521*4882a593Smuzhiyun		kfree(foo);
522*4882a593Smuzhiyun		return ret;
523*4882a593Smuzhiyun
524*4882a593SmuzhiyunIdealmente, dovreste simulare condizioni d'errore per verificare i vostri
525*4882a593Smuzhiyunpercorsi d'uscita.
526*4882a593Smuzhiyun
527*4882a593Smuzhiyun
528*4882a593Smuzhiyun8) Commenti
529*4882a593Smuzhiyun-----------
530*4882a593Smuzhiyun
531*4882a593SmuzhiyunI commenti sono una buona cosa, ma c'è anche il rischio di esagerare.  MAI
532*4882a593Smuzhiyunspiegare COME funziona il vostro codice in un commento: è molto meglio
533*4882a593Smuzhiyunscrivere il codice di modo che il suo funzionamento sia ovvio, inoltre
534*4882a593Smuzhiyunspiegare codice scritto male è una perdita di tempo.
535*4882a593Smuzhiyun
536*4882a593SmuzhiyunSolitamente, i commenti devono dire COSA fa il codice, e non COME lo fa.
537*4882a593SmuzhiyunInoltre, cercate di evitare i commenti nel corpo della funzione: se la
538*4882a593Smuzhiyunfunzione è così complessa che dovete commentarla a pezzi, allora dovreste
539*4882a593Smuzhiyuntornare al punto 6 per un momento.  Potete mettere dei piccoli commenti per
540*4882a593Smuzhiyunannotare o avvisare il lettore circa un qualcosa di particolarmente arguto
541*4882a593Smuzhiyun(o brutto), ma cercate di non esagerare.  Invece, mettete i commenti in
542*4882a593Smuzhiyuntesta alla funzione spiegando alle persone cosa fa, e possibilmente anche
543*4882a593Smuzhiyunil PERCHÉ.
544*4882a593Smuzhiyun
545*4882a593SmuzhiyunPer favore, quando commentate una funzione dell'API del kernel usate il
546*4882a593Smuzhiyunformato kernel-doc.  Per maggiori dettagli, leggete i file in
547*4882a593Smuzhiyun:ref::ref:`Documentation/translations/it_IT/doc-guide/ <it_doc_guide>` e in
548*4882a593Smuzhiyun``script/kernel-doc``.
549*4882a593Smuzhiyun
550*4882a593SmuzhiyunLo stile preferito per i commenti più lunghi (multi-riga) è:
551*4882a593Smuzhiyun
552*4882a593Smuzhiyun.. code-block:: c
553*4882a593Smuzhiyun
554*4882a593Smuzhiyun	/*
555*4882a593Smuzhiyun	 * This is the preferred style for multi-line
556*4882a593Smuzhiyun	 * comments in the Linux kernel source code.
557*4882a593Smuzhiyun	 * Please use it consistently.
558*4882a593Smuzhiyun	 *
559*4882a593Smuzhiyun	 * Description:  A column of asterisks on the left side,
560*4882a593Smuzhiyun	 * with beginning and ending almost-blank lines.
561*4882a593Smuzhiyun	 */
562*4882a593Smuzhiyun
563*4882a593SmuzhiyunPer i file in net/ e in drivers/net/ lo stile preferito per i commenti
564*4882a593Smuzhiyunpiù lunghi (multi-riga) è leggermente diverso.
565*4882a593Smuzhiyun
566*4882a593Smuzhiyun.. code-block:: c
567*4882a593Smuzhiyun
568*4882a593Smuzhiyun	/* The preferred comment style for files in net/ and drivers/net
569*4882a593Smuzhiyun	 * looks like this.
570*4882a593Smuzhiyun	 *
571*4882a593Smuzhiyun	 * It is nearly the same as the generally preferred comment style,
572*4882a593Smuzhiyun	 * but there is no initial almost-blank line.
573*4882a593Smuzhiyun	 */
574*4882a593Smuzhiyun
575*4882a593SmuzhiyunÈ anche importante commentare i dati, sia per i tipi base che per tipi
576*4882a593Smuzhiyunderivati.  A questo scopo, dichiarate un dato per riga (niente virgole
577*4882a593Smuzhiyunper una dichiarazione multipla).  Questo vi lascerà spazio per un piccolo
578*4882a593Smuzhiyuncommento per spiegarne l'uso.
579*4882a593Smuzhiyun
580*4882a593Smuzhiyun
581*4882a593Smuzhiyun9) Avete fatto un pasticcio
582*4882a593Smuzhiyun---------------------------
583*4882a593Smuzhiyun
584*4882a593SmuzhiyunVa bene, li facciamo tutti.  Probabilmente vi è stato detto dal vostro
585*4882a593Smuzhiyunaiutante Unix di fiducia che ``GNU emacs`` formatta automaticamente il
586*4882a593Smuzhiyuncodice C per conto vostro, e avete notato che sì, in effetti lo fa, ma che
587*4882a593Smuzhiyuni modi predefiniti non sono proprio allettanti (infatti, sono peggio che
588*4882a593Smuzhiyunpremere tasti a caso - un numero infinito di scimmie che scrivono in
589*4882a593SmuzhiyunGNU emacs non faranno mai un buon programma).
590*4882a593Smuzhiyun
591*4882a593SmuzhiyunQuindi, potete sbarazzarvi di GNU emacs, o riconfigurarlo con valori più
592*4882a593Smuzhiyunsensati.  Per fare quest'ultima cosa, potete appiccicare il codice che
593*4882a593Smuzhiyunsegue nel vostro file .emacs:
594*4882a593Smuzhiyun
595*4882a593Smuzhiyun.. code-block:: none
596*4882a593Smuzhiyun
597*4882a593Smuzhiyun  (defun c-lineup-arglist-tabs-only (ignored)
598*4882a593Smuzhiyun    "Line up argument lists by tabs, not spaces"
599*4882a593Smuzhiyun    (let* ((anchor (c-langelem-pos c-syntactic-element))
600*4882a593Smuzhiyun           (column (c-langelem-2nd-pos c-syntactic-element))
601*4882a593Smuzhiyun           (offset (- (1+ column) anchor))
602*4882a593Smuzhiyun           (steps (floor offset c-basic-offset)))
603*4882a593Smuzhiyun      (* (max steps 1)
604*4882a593Smuzhiyun         c-basic-offset)))
605*4882a593Smuzhiyun
606*4882a593Smuzhiyun  (dir-locals-set-class-variables
607*4882a593Smuzhiyun   'linux-kernel
608*4882a593Smuzhiyun   '((c-mode . (
609*4882a593Smuzhiyun          (c-basic-offset . 8)
610*4882a593Smuzhiyun          (c-label-minimum-indentation . 0)
611*4882a593Smuzhiyun          (c-offsets-alist . (
612*4882a593Smuzhiyun                  (arglist-close         . c-lineup-arglist-tabs-only)
613*4882a593Smuzhiyun                  (arglist-cont-nonempty .
614*4882a593Smuzhiyun		      (c-lineup-gcc-asm-reg c-lineup-arglist-tabs-only))
615*4882a593Smuzhiyun                  (arglist-intro         . +)
616*4882a593Smuzhiyun                  (brace-list-intro      . +)
617*4882a593Smuzhiyun                  (c                     . c-lineup-C-comments)
618*4882a593Smuzhiyun                  (case-label            . 0)
619*4882a593Smuzhiyun                  (comment-intro         . c-lineup-comment)
620*4882a593Smuzhiyun                  (cpp-define-intro      . +)
621*4882a593Smuzhiyun                  (cpp-macro             . -1000)
622*4882a593Smuzhiyun                  (cpp-macro-cont        . +)
623*4882a593Smuzhiyun                  (defun-block-intro     . +)
624*4882a593Smuzhiyun                  (else-clause           . 0)
625*4882a593Smuzhiyun                  (func-decl-cont        . +)
626*4882a593Smuzhiyun                  (inclass               . +)
627*4882a593Smuzhiyun                  (inher-cont            . c-lineup-multi-inher)
628*4882a593Smuzhiyun                  (knr-argdecl-intro     . 0)
629*4882a593Smuzhiyun                  (label                 . -1000)
630*4882a593Smuzhiyun                  (statement             . 0)
631*4882a593Smuzhiyun                  (statement-block-intro . +)
632*4882a593Smuzhiyun                  (statement-case-intro  . +)
633*4882a593Smuzhiyun                  (statement-cont        . +)
634*4882a593Smuzhiyun                  (substatement          . +)
635*4882a593Smuzhiyun                  ))
636*4882a593Smuzhiyun          (indent-tabs-mode . t)
637*4882a593Smuzhiyun          (show-trailing-whitespace . t)
638*4882a593Smuzhiyun          ))))
639*4882a593Smuzhiyun
640*4882a593Smuzhiyun  (dir-locals-set-directory-class
641*4882a593Smuzhiyun   (expand-file-name "~/src/linux-trees")
642*4882a593Smuzhiyun   'linux-kernel)
643*4882a593Smuzhiyun
644*4882a593SmuzhiyunQuesto farà funzionare meglio emacs con lo stile del kernel per i file che
645*4882a593Smuzhiyunsi trovano nella cartella ``~/src/linux-trees``.
646*4882a593Smuzhiyun
647*4882a593SmuzhiyunMa anche se doveste fallire nell'ottenere una formattazione sensata in emacs
648*4882a593Smuzhiyunnon tutto è perduto: usate ``indent``.
649*4882a593Smuzhiyun
650*4882a593SmuzhiyunOra, ancora, GNU indent ha la stessa configurazione decerebrata di GNU emacs,
651*4882a593Smuzhiyuned è per questo che dovete passargli alcune opzioni da riga di comando.
652*4882a593SmuzhiyunTuttavia, non è così terribile, perché perfino i creatori di GNU indent
653*4882a593Smuzhiyunriconoscono l'autorità di K&R (le persone del progetto GNU non sono cattive,
654*4882a593Smuzhiyunsono solo mal indirizzate sull'argomento), quindi date ad indent le opzioni
655*4882a593Smuzhiyun``-kr -i8`` (che significa ``K&R, 8 caratteri di indentazione``), o utilizzate
656*4882a593Smuzhiyun``scripts/Lindent`` che indenterà usando l'ultimo stile.
657*4882a593Smuzhiyun
658*4882a593Smuzhiyun``indent`` ha un sacco di opzioni, e specialmente quando si tratta di
659*4882a593Smuzhiyunriformattare i commenti dovreste dare un'occhiata alle pagine man.
660*4882a593SmuzhiyunMa ricordatevi: ``indent`` non è un correttore per una cattiva programmazione.
661*4882a593Smuzhiyun
662*4882a593SmuzhiyunDa notare che potete utilizzare anche ``clang-format`` per aiutarvi con queste
663*4882a593Smuzhiyunregole, per riformattare rapidamente ad automaticamente alcune parti del
664*4882a593Smuzhiyunvostro codice, e per revisionare interi file al fine di identificare errori
665*4882a593Smuzhiyundi stile, refusi e possibilmente anche delle migliorie. È anche utile per
666*4882a593Smuzhiyunordinare gli ``#include``, per allineare variabili/macro, per ridistribuire
667*4882a593Smuzhiyunil testo e altre cose simili.
668*4882a593SmuzhiyunPer maggiori dettagli, consultate il file
669*4882a593Smuzhiyun:ref:`Documentation/translations/it_IT/process/clang-format.rst <it_clangformat>`.
670*4882a593Smuzhiyun
671*4882a593Smuzhiyun
672*4882a593Smuzhiyun10) File di configurazione Kconfig
673*4882a593Smuzhiyun----------------------------------
674*4882a593Smuzhiyun
675*4882a593SmuzhiyunPer tutti i file di configurazione Kconfig* che si possono trovare nei
676*4882a593Smuzhiyunsorgenti, l'indentazione è un po' differente.  Le linee dopo un ``config``
677*4882a593Smuzhiyunsono indentate con un tab, mentre il testo descrittivo è indentato di
678*4882a593Smuzhiyunulteriori due spazi.  Esempio::
679*4882a593Smuzhiyun
680*4882a593Smuzhiyun  config AUDIT
681*4882a593Smuzhiyun	bool "Auditing support"
682*4882a593Smuzhiyun	depends on NET
683*4882a593Smuzhiyun	help
684*4882a593Smuzhiyun	  Enable auditing infrastructure that can be used with another
685*4882a593Smuzhiyun	  kernel subsystem, such as SELinux (which requires this for
686*4882a593Smuzhiyun	  logging of avc messages output).  Does not do system-call
687*4882a593Smuzhiyun	  auditing without CONFIG_AUDITSYSCALL.
688*4882a593Smuzhiyun
689*4882a593SmuzhiyunLe funzionalità davvero pericolose (per esempio il supporto alla scrittura
690*4882a593Smuzhiyunper certi filesystem) dovrebbero essere dichiarate chiaramente come tali
691*4882a593Smuzhiyunnella stringa di titolo::
692*4882a593Smuzhiyun
693*4882a593Smuzhiyun  config ADFS_FS_RW
694*4882a593Smuzhiyun	bool "ADFS write support (DANGEROUS)"
695*4882a593Smuzhiyun	depends on ADFS_FS
696*4882a593Smuzhiyun	...
697*4882a593Smuzhiyun
698*4882a593SmuzhiyunPer la documentazione completa sui file di configurazione, consultate
699*4882a593Smuzhiyunil documento Documentation/kbuild/kconfig-language.rst
700*4882a593Smuzhiyun
701*4882a593Smuzhiyun
702*4882a593Smuzhiyun11) Strutture dati
703*4882a593Smuzhiyun------------------
704*4882a593Smuzhiyun
705*4882a593SmuzhiyunLe strutture dati che hanno una visibilità superiore al contesto del
706*4882a593Smuzhiyunsingolo thread in cui vengono create e distrutte, dovrebbero sempre
707*4882a593Smuzhiyunavere un contatore di riferimenti.  Nel kernel non esiste un
708*4882a593Smuzhiyun*garbage collector* (e fuori dal kernel i *garbage collector* sono lenti
709*4882a593Smuzhiyune inefficienti), questo significa che **dovete** assolutamente avere un
710*4882a593Smuzhiyuncontatore di riferimenti per ogni cosa che usate.
711*4882a593Smuzhiyun
712*4882a593SmuzhiyunAvere un contatore di riferimenti significa che potete evitare la
713*4882a593Smuzhiyunsincronizzazione e permette a più utenti di accedere alla struttura dati
714*4882a593Smuzhiyunin parallelo - e non doversi preoccupare di una struttura dati che
715*4882a593Smuzhiyunimprovvisamente sparisce dalla loro vista perché il loro processo dormiva
716*4882a593Smuzhiyuno stava facendo altro per un attimo.
717*4882a593Smuzhiyun
718*4882a593SmuzhiyunDa notare che la sincronizzazione **non** si sostituisce al conteggio dei
719*4882a593Smuzhiyunriferimenti.  La sincronizzazione ha lo scopo di mantenere le strutture
720*4882a593Smuzhiyundati coerenti, mentre il conteggio dei riferimenti è una tecnica di gestione
721*4882a593Smuzhiyundella memoria.  Solitamente servono entrambe le cose, e non vanno confuse fra
722*4882a593Smuzhiyundi loro.
723*4882a593Smuzhiyun
724*4882a593SmuzhiyunQuando si hanno diverse classi di utenti, le strutture dati possono avere
725*4882a593Smuzhiyundue livelli di contatori di riferimenti.  Il contatore di classe conta
726*4882a593Smuzhiyunil numero dei suoi utenti, e il contatore globale viene decrementato una
727*4882a593Smuzhiyunsola volta quando il contatore di classe va a zero.
728*4882a593Smuzhiyun
729*4882a593SmuzhiyunUn esempio di questo tipo di conteggio dei riferimenti multi-livello può
730*4882a593Smuzhiyunessere trovato nella gestore della memoria (``struct mm_sturct``: mm_user e
731*4882a593Smuzhiyunmm_count), e nel codice dei filesystem (``struct super_block``: s_count e
732*4882a593Smuzhiyuns_active).
733*4882a593Smuzhiyun
734*4882a593SmuzhiyunRicordatevi: se un altro thread può trovare la vostra struttura dati, e non
735*4882a593Smuzhiyunavete un contatore di riferimenti per essa, quasi certamente avete un baco.
736*4882a593Smuzhiyun
737*4882a593Smuzhiyun12) Macro, enumerati e RTL
738*4882a593Smuzhiyun---------------------------
739*4882a593Smuzhiyun
740*4882a593SmuzhiyunI nomi delle macro che definiscono delle costanti e le etichette degli
741*4882a593Smuzhiyunenumerati sono scritte in maiuscolo.
742*4882a593Smuzhiyun
743*4882a593Smuzhiyun.. code-block:: c
744*4882a593Smuzhiyun
745*4882a593Smuzhiyun	#define CONSTANT 0x12345
746*4882a593Smuzhiyun
747*4882a593SmuzhiyunGli enumerati sono da preferire quando si definiscono molte costanti correlate.
748*4882a593Smuzhiyun
749*4882a593SmuzhiyunI nomi delle macro in MAIUSCOLO sono preferibili ma le macro che assomigliano
750*4882a593Smuzhiyuna delle funzioni possono essere scritte in minuscolo.
751*4882a593Smuzhiyun
752*4882a593SmuzhiyunGeneralmente, le funzioni inline sono preferibili rispetto alle macro che
753*4882a593Smuzhiyunsembrano funzioni.
754*4882a593Smuzhiyun
755*4882a593SmuzhiyunLe macro che contengono più istruzioni dovrebbero essere sempre chiuse in un
756*4882a593Smuzhiyunblocco do - while:
757*4882a593Smuzhiyun
758*4882a593Smuzhiyun.. code-block:: c
759*4882a593Smuzhiyun
760*4882a593Smuzhiyun	#define macrofun(a, b, c)			\
761*4882a593Smuzhiyun		do {					\
762*4882a593Smuzhiyun			if (a == 5)			\
763*4882a593Smuzhiyun				do_this(b, c);		\
764*4882a593Smuzhiyun		} while (0)
765*4882a593Smuzhiyun
766*4882a593SmuzhiyunCose da evitare quando si usano le macro:
767*4882a593Smuzhiyun
768*4882a593Smuzhiyun1) le macro che hanno effetti sul flusso del codice:
769*4882a593Smuzhiyun
770*4882a593Smuzhiyun.. code-block:: c
771*4882a593Smuzhiyun
772*4882a593Smuzhiyun	#define FOO(x)					\
773*4882a593Smuzhiyun		do {					\
774*4882a593Smuzhiyun			if (blah(x) < 0)		\
775*4882a593Smuzhiyun				return -EBUGGERED;	\
776*4882a593Smuzhiyun		} while (0)
777*4882a593Smuzhiyun
778*4882a593Smuzhiyunsono **proprio** una pessima idea.  Sembra una chiamata a funzione ma termina
779*4882a593Smuzhiyunla funzione chiamante; non cercate di rompere il decodificatore interno di
780*4882a593Smuzhiyunchi legge il codice.
781*4882a593Smuzhiyun
782*4882a593Smuzhiyun2) le macro che dipendono dall'uso di una variabile locale con un nome magico:
783*4882a593Smuzhiyun
784*4882a593Smuzhiyun.. code-block:: c
785*4882a593Smuzhiyun
786*4882a593Smuzhiyun	#define FOO(val) bar(index, val)
787*4882a593Smuzhiyun
788*4882a593Smuzhiyunpotrebbe sembrare una bella cosa, ma è dannatamente confusionario quando uno
789*4882a593Smuzhiyunlegge il codice e potrebbe romperlo con una cambiamento che sembra innocente.
790*4882a593Smuzhiyun
791*4882a593Smuzhiyun3) le macro con argomenti che sono utilizzati come l-values; questo potrebbe
792*4882a593Smuzhiyunritorcervisi contro se qualcuno, per esempio, trasforma FOO in una funzione
793*4882a593Smuzhiyuninline.
794*4882a593Smuzhiyun
795*4882a593Smuzhiyun4) dimenticatevi delle precedenze: le macro che definiscono espressioni devono
796*4882a593Smuzhiyunessere racchiuse fra parentesi. State attenti a problemi simili con le macro
797*4882a593Smuzhiyunparametrizzate.
798*4882a593Smuzhiyun
799*4882a593Smuzhiyun.. code-block:: c
800*4882a593Smuzhiyun
801*4882a593Smuzhiyun	#define CONSTANT 0x4000
802*4882a593Smuzhiyun	#define CONSTEXP (CONSTANT | 3)
803*4882a593Smuzhiyun
804*4882a593Smuzhiyun5) collisione nello spazio dei nomi quando si definisce una variabile locale in
805*4882a593Smuzhiyununa macro che sembra una funzione:
806*4882a593Smuzhiyun
807*4882a593Smuzhiyun.. code-block:: c
808*4882a593Smuzhiyun
809*4882a593Smuzhiyun	#define FOO(x)				\
810*4882a593Smuzhiyun	({					\
811*4882a593Smuzhiyun		typeof(x) ret;			\
812*4882a593Smuzhiyun		ret = calc_ret(x);		\
813*4882a593Smuzhiyun		(ret);				\
814*4882a593Smuzhiyun	})
815*4882a593Smuzhiyun
816*4882a593Smuzhiyunret è un nome comune per una variabile locale - __foo_ret difficilmente
817*4882a593Smuzhiyunandrà in conflitto con una variabile già esistente.
818*4882a593Smuzhiyun
819*4882a593SmuzhiyunIl manuale di cpp si occupa esaustivamente delle macro. Il manuale di sviluppo
820*4882a593Smuzhiyundi gcc copre anche l'RTL che viene usato frequentemente nel kernel per il
821*4882a593Smuzhiyunlinguaggio assembler.
822*4882a593Smuzhiyun
823*4882a593Smuzhiyun13) Visualizzare i messaggi del kernel
824*4882a593Smuzhiyun--------------------------------------
825*4882a593Smuzhiyun
826*4882a593SmuzhiyunAgli sviluppatori del kernel piace essere visti come dotti. Tenete un occhio
827*4882a593Smuzhiyundi riguardo per l'ortografia e farete una belle figura. In inglese, evitate
828*4882a593Smuzhiyunl'uso incorretto di abbreviazioni come ``dont``: usate ``do not`` oppure
829*4882a593Smuzhiyun``don't``.  Scrivete messaggi concisi, chiari, e inequivocabili.
830*4882a593Smuzhiyun
831*4882a593SmuzhiyunI messaggi del kernel non devono terminare con un punto fermo.
832*4882a593Smuzhiyun
833*4882a593SmuzhiyunScrivere i numeri fra parentesi (%d) non migliora alcunché e per questo
834*4882a593Smuzhiyundovrebbero essere evitati.
835*4882a593Smuzhiyun
836*4882a593SmuzhiyunCi sono alcune macro per la diagnostica in <linux/device.h> che dovreste
837*4882a593Smuzhiyunusare per assicurarvi che i messaggi vengano associati correttamente ai
838*4882a593Smuzhiyundispositivi e ai driver, e che siano etichettati correttamente:  dev_err(),
839*4882a593Smuzhiyundev_warn(), dev_info(), e così via.  Per messaggi che non sono associati ad
840*4882a593Smuzhiyunalcun dispositivo, <linux/printk.h> definisce pr_info(), pr_warn(), pr_err(),
841*4882a593Smuzhiyuneccetera.
842*4882a593Smuzhiyun
843*4882a593SmuzhiyunTirar fuori un buon messaggio di debug può essere una vera sfida; e quando
844*4882a593Smuzhiyunl'avete può essere d'enorme aiuto per risolvere problemi da remoto.
845*4882a593SmuzhiyunTuttavia, i messaggi di debug sono gestiti differentemente rispetto agli
846*4882a593Smuzhiyunaltri.  Le funzioni pr_XXX() stampano incondizionatamente ma pr_debug() no;
847*4882a593Smuzhiyunessa non viene compilata nella configurazione predefinita, a meno che
848*4882a593SmuzhiyunDEBUG o CONFIG_DYNAMIC_DEBUG non vengono impostati.  Questo vale anche per
849*4882a593Smuzhiyundev_dbg() e in aggiunta VERBOSE_DEBUG per aggiungere i messaggi dev_vdbg().
850*4882a593Smuzhiyun
851*4882a593SmuzhiyunMolti sottosistemi hanno delle opzioni di debug in Kconfig che aggiungono
852*4882a593Smuzhiyun-DDEBUG nei corrispettivi Makefile, e in altri casi aggiungono #define DEBUG
853*4882a593Smuzhiyunin specifici file.  Infine, quando un messaggio di debug dev'essere stampato
854*4882a593Smuzhiyunincondizionatamente, per esempio perché siete già in una sezione di debug
855*4882a593Smuzhiyunracchiusa in #ifdef, potete usare printk(KERN_DEBUG ...).
856*4882a593Smuzhiyun
857*4882a593Smuzhiyun14) Assegnare memoria
858*4882a593Smuzhiyun---------------------
859*4882a593Smuzhiyun
860*4882a593SmuzhiyunIl kernel fornisce i seguenti assegnatori ad uso generico:
861*4882a593Smuzhiyunkmalloc(), kzalloc(), kmalloc_array(), kcalloc(), vmalloc(), e vzalloc().
862*4882a593SmuzhiyunPer maggiori informazioni, consultate la documentazione dell'API:
863*4882a593Smuzhiyun:ref:`Documentation/translations/it_IT/core-api/memory-allocation.rst <it_memory_allocation>`
864*4882a593Smuzhiyun
865*4882a593SmuzhiyunIl modo preferito per passare la dimensione di una struttura è il seguente:
866*4882a593Smuzhiyun
867*4882a593Smuzhiyun.. code-block:: c
868*4882a593Smuzhiyun
869*4882a593Smuzhiyun	p = kmalloc(sizeof(*p), ...);
870*4882a593Smuzhiyun
871*4882a593SmuzhiyunLa forma alternativa, dove il nome della struttura viene scritto interamente,
872*4882a593Smuzhiyunpeggiora la leggibilità e introduce possibili bachi quando il tipo di
873*4882a593Smuzhiyunpuntatore cambia tipo ma il corrispondente sizeof non viene aggiornato.
874*4882a593Smuzhiyun
875*4882a593SmuzhiyunIl valore di ritorno è un puntatore void, effettuare un cast su di esso è
876*4882a593Smuzhiyunridondante. La conversione fra un puntatore void e un qualsiasi altro tipo
877*4882a593Smuzhiyundi puntatore è garantito dal linguaggio di programmazione C.
878*4882a593Smuzhiyun
879*4882a593SmuzhiyunIl modo preferito per assegnare un vettore è il seguente:
880*4882a593Smuzhiyun
881*4882a593Smuzhiyun.. code-block:: c
882*4882a593Smuzhiyun
883*4882a593Smuzhiyun	p = kmalloc_array(n, sizeof(...), ...);
884*4882a593Smuzhiyun
885*4882a593SmuzhiyunIl modo preferito per assegnare un vettore a zero è il seguente:
886*4882a593Smuzhiyun
887*4882a593Smuzhiyun.. code-block:: c
888*4882a593Smuzhiyun
889*4882a593Smuzhiyun	p = kcalloc(n, sizeof(...), ...);
890*4882a593Smuzhiyun
891*4882a593SmuzhiyunEntrambe verificano la condizione di overflow per la dimensione
892*4882a593Smuzhiyund'assegnamento n * sizeof(...), se accade ritorneranno NULL.
893*4882a593Smuzhiyun
894*4882a593SmuzhiyunQuesti allocatori generici producono uno *stack dump* in caso di fallimento
895*4882a593Smuzhiyuna meno che non venga esplicitamente specificato __GFP_NOWARN. Quindi, nella
896*4882a593Smuzhiyunmaggior parte dei casi, è inutile stampare messaggi aggiuntivi quando uno di
897*4882a593Smuzhiyunquesti allocatori ritornano un puntatore NULL.
898*4882a593Smuzhiyun
899*4882a593Smuzhiyun15) Il morbo inline
900*4882a593Smuzhiyun-------------------
901*4882a593Smuzhiyun
902*4882a593SmuzhiyunSembra che ci sia la percezione errata che gcc abbia una qualche magica
903*4882a593Smuzhiyunopzione "rendimi più veloce" chiamata ``inline``. In alcuni casi l'uso di
904*4882a593Smuzhiyuninline è appropriato (per esempio in sostituzione delle macro, vedi
905*4882a593Smuzhiyuncapitolo 12), ma molto spesso non lo è. L'uso abbondante della parola chiave
906*4882a593Smuzhiyuninline porta ad avere un kernel più grande, che si traduce in un sistema nel
907*4882a593Smuzhiyunsuo complesso più lento per via di una cache per le istruzioni della CPU più
908*4882a593Smuzhiyungrande e poi semplicemente perché ci sarà meno spazio disponibile per una
909*4882a593Smuzhiyunpagina di cache. Pensateci un attimo; una fallimento nella cache causa una
910*4882a593Smuzhiyunricerca su disco che può tranquillamente richiedere 5 millisecondi. Ci sono
911*4882a593SmuzhiyunTANTI cicli di CPU che potrebbero essere usati in questi 5 millisecondi.
912*4882a593Smuzhiyun
913*4882a593SmuzhiyunSpesso le persone dicono che aggiungere inline a delle funzioni dichiarate
914*4882a593Smuzhiyunstatic e utilizzare una sola volta è sempre una scelta vincente perché non
915*4882a593Smuzhiyunci sono altri compromessi. Questo è tecnicamente vero ma gcc è in grado di
916*4882a593Smuzhiyuntrasformare automaticamente queste funzioni in inline; i problemi di
917*4882a593Smuzhiyunmanutenzione del codice per rimuovere gli inline quando compare un secondo
918*4882a593Smuzhiyunutente surclassano il potenziale vantaggio nel suggerire a gcc di fare una
919*4882a593Smuzhiyuncosa che avrebbe fatto comunque.
920*4882a593Smuzhiyun
921*4882a593Smuzhiyun16) Nomi e valori di ritorno delle funzioni
922*4882a593Smuzhiyun-------------------------------------------
923*4882a593Smuzhiyun
924*4882a593SmuzhiyunLe funzioni possono ritornare diversi tipi di valori, e uno dei più comuni
925*4882a593Smuzhiyunè quel valore che indica se una funzione ha completato con successo o meno.
926*4882a593SmuzhiyunQuesto valore può essere rappresentato come un codice di errore intero
927*4882a593Smuzhiyun(-Exxx = fallimento, 0 = successo) oppure un booleano di successo
928*4882a593Smuzhiyun(0 = fallimento, non-zero = successo).
929*4882a593Smuzhiyun
930*4882a593SmuzhiyunMischiare questi due tipi di rappresentazioni è un terreno fertile per
931*4882a593Smuzhiyuni bachi più insidiosi.  Se il linguaggio C includesse una forte distinzione
932*4882a593Smuzhiyunfra gli interi e i booleani, allora il compilatore potrebbe trovare questi
933*4882a593Smuzhiyunerrori per conto nostro ... ma questo non c'è.  Per evitare di imbattersi
934*4882a593Smuzhiyunin questo tipo di baco, seguite sempre la seguente convenzione::
935*4882a593Smuzhiyun
936*4882a593Smuzhiyun	Se il nome di una funzione è un'azione o un comando imperativo,
937*4882a593Smuzhiyun	essa dovrebbe ritornare un codice di errore intero.  Se il nome
938*4882a593Smuzhiyun	è un predicato, la funzione dovrebbe ritornare un booleano di
939*4882a593Smuzhiyun	"successo"
940*4882a593Smuzhiyun
941*4882a593SmuzhiyunPer esempio, ``add work`` è un comando, e la funzione add_work() ritorna 0
942*4882a593Smuzhiyunin caso di successo o -EBUSY in caso di fallimento.  Allo stesso modo,
943*4882a593Smuzhiyun``PCI device present`` è un predicato, e la funzione pci_dev_present() ritorna
944*4882a593Smuzhiyun1 se trova il dispositivo corrispondente con successo, altrimenti 0.
945*4882a593Smuzhiyun
946*4882a593SmuzhiyunTutte le funzioni esportate (EXPORT) devono rispettare questa convenzione, e
947*4882a593Smuzhiyuncosì dovrebbero anche tutte le funzioni pubbliche.  Le funzioni private
948*4882a593Smuzhiyun(static) possono non seguire questa convenzione, ma è comunque raccomandato
949*4882a593Smuzhiyunche lo facciano.
950*4882a593Smuzhiyun
951*4882a593SmuzhiyunLe funzioni il cui valore di ritorno è il risultato di una computazione,
952*4882a593Smuzhiyunpiuttosto che l'indicazione sul successo di tale computazione, non sono
953*4882a593Smuzhiyunsoggette a questa regola.  Solitamente si indicano gli errori ritornando un
954*4882a593Smuzhiyunqualche valore fuori dai limiti.  Un tipico esempio è quello delle funzioni
955*4882a593Smuzhiyunche ritornano un puntatore; queste utilizzano NULL o ERR_PTR come meccanismo
956*4882a593Smuzhiyundi notifica degli errori.
957*4882a593Smuzhiyun
958*4882a593Smuzhiyun17) L'uso di bool
959*4882a593Smuzhiyun-----------------
960*4882a593Smuzhiyun
961*4882a593SmuzhiyunNel kernel Linux il tipo bool deriva dal tipo _Bool dello standard C99.
962*4882a593SmuzhiyunUn valore bool può assumere solo i valori 0 o 1, e implicitamente o
963*4882a593Smuzhiyunesplicitamente la conversione a bool converte i valori in vero (*true*) o
964*4882a593Smuzhiyunfalso (*false*).  Quando si usa un tipo bool il costrutto !! non sarà più
965*4882a593Smuzhiyunnecessario, e questo va ad eliminare una certa serie di bachi.
966*4882a593Smuzhiyun
967*4882a593SmuzhiyunQuando si usano i valori booleani, dovreste utilizzare le definizioni di true
968*4882a593Smuzhiyune false al posto dei valori 1 e 0.
969*4882a593Smuzhiyun
970*4882a593SmuzhiyunPer il valore di ritorno delle funzioni e per le variabili sullo stack, l'uso
971*4882a593Smuzhiyundel tipo bool è sempre appropriato.  L'uso di bool viene incoraggiato per
972*4882a593Smuzhiyunmigliorare la leggibilità e spesso è molto meglio di 'int' nella gestione di
973*4882a593Smuzhiyunvalori booleani.
974*4882a593Smuzhiyun
975*4882a593SmuzhiyunNon usate bool se per voi sono importanti l'ordine delle righe di cache o
976*4882a593Smuzhiyunla loro dimensione; la dimensione e l'allineamento cambia a seconda
977*4882a593Smuzhiyundell'architettura per la quale è stato compilato.  Le strutture che sono state
978*4882a593Smuzhiyunottimizzate per l'allineamento o la dimensione non dovrebbero usare bool.
979*4882a593Smuzhiyun
980*4882a593SmuzhiyunSe una struttura ha molti valori true/false, considerate l'idea di raggrupparli
981*4882a593Smuzhiyunin un intero usando campi da 1 bit, oppure usate un tipo dalla larghezza fissa,
982*4882a593Smuzhiyuncome u8.
983*4882a593Smuzhiyun
984*4882a593SmuzhiyunCome per gli argomenti delle funzioni, molti valori true/false possono essere
985*4882a593Smuzhiyunraggruppati in un singolo argomento a bit denominato 'flags'; spesso 'flags' è
986*4882a593Smuzhiyunun'alternativa molto più leggibile se si hanno valori costanti per true/false.
987*4882a593Smuzhiyun
988*4882a593SmuzhiyunDetto ciò, un uso parsimonioso di bool nelle strutture dati e negli argomenti
989*4882a593Smuzhiyunpuò migliorare la leggibilità.
990*4882a593Smuzhiyun
991*4882a593Smuzhiyun18) Non reinventate le macro del kernel
992*4882a593Smuzhiyun---------------------------------------
993*4882a593Smuzhiyun
994*4882a593SmuzhiyunIl file di intestazione include/linux/kernel.h contiene un certo numero
995*4882a593Smuzhiyundi macro che dovreste usare piuttosto che implementarne una qualche variante.
996*4882a593SmuzhiyunPer esempio, se dovete calcolare la lunghezza di un vettore, sfruttate la
997*4882a593Smuzhiyunmacro:
998*4882a593Smuzhiyun
999*4882a593Smuzhiyun.. code-block:: c
1000*4882a593Smuzhiyun
1001*4882a593Smuzhiyun	#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
1002*4882a593Smuzhiyun
1003*4882a593SmuzhiyunAnalogamente, se dovete calcolare la dimensione di un qualche campo di una
1004*4882a593Smuzhiyunstruttura, usate
1005*4882a593Smuzhiyun
1006*4882a593Smuzhiyun.. code-block:: c
1007*4882a593Smuzhiyun
1008*4882a593Smuzhiyun	#define sizeof_field(t, f) (sizeof(((t*)0)->f))
1009*4882a593Smuzhiyun
1010*4882a593SmuzhiyunCi sono anche le macro min() e max() che, se vi serve, effettuano un controllo
1011*4882a593Smuzhiyunrigido sui tipi.  Sentitevi liberi di leggere attentamente questo file
1012*4882a593Smuzhiyund'intestazione per scoprire cos'altro è stato definito che non dovreste
1013*4882a593Smuzhiyunreinventare nel vostro codice.
1014*4882a593Smuzhiyun
1015*4882a593Smuzhiyun19) Linee di configurazione degli editor e altre schifezze
1016*4882a593Smuzhiyun-----------------------------------------------------------
1017*4882a593Smuzhiyun
1018*4882a593SmuzhiyunAlcuni editor possono interpretare dei parametri di configurazione integrati
1019*4882a593Smuzhiyunnei file sorgenti e indicati con dai marcatori speciali.  Per esempio, emacs
1020*4882a593Smuzhiyuninterpreta le linee marcate nel seguente modo:
1021*4882a593Smuzhiyun
1022*4882a593Smuzhiyun.. code-block:: c
1023*4882a593Smuzhiyun
1024*4882a593Smuzhiyun	-*- mode: c -*-
1025*4882a593Smuzhiyun
1026*4882a593SmuzhiyunO come queste:
1027*4882a593Smuzhiyun
1028*4882a593Smuzhiyun.. code-block:: c
1029*4882a593Smuzhiyun
1030*4882a593Smuzhiyun	/*
1031*4882a593Smuzhiyun	Local Variables:
1032*4882a593Smuzhiyun	compile-command: "gcc -DMAGIC_DEBUG_FLAG foo.c"
1033*4882a593Smuzhiyun	End:
1034*4882a593Smuzhiyun	*/
1035*4882a593Smuzhiyun
1036*4882a593SmuzhiyunVim interpreta i marcatori come questi:
1037*4882a593Smuzhiyun
1038*4882a593Smuzhiyun.. code-block:: c
1039*4882a593Smuzhiyun
1040*4882a593Smuzhiyun	/* vim:set sw=8 noet */
1041*4882a593Smuzhiyun
1042*4882a593SmuzhiyunNon includete nessuna di queste cose nei file sorgenti.  Le persone hanno le
1043*4882a593Smuzhiyunproprie configurazioni personali per l'editor, e i vostri sorgenti non
1044*4882a593Smuzhiyundovrebbero sovrascrivergliele.  Questo vale anche per i marcatori
1045*4882a593Smuzhiyund'indentazione e di modalità d'uso.  Le persone potrebbero aver configurato una
1046*4882a593Smuzhiyunmodalità su misura, oppure potrebbero avere qualche altra magia per far
1047*4882a593Smuzhiyunfunzionare bene l'indentazione.
1048*4882a593Smuzhiyun
1049*4882a593Smuzhiyun20) Inline assembly
1050*4882a593Smuzhiyun-------------------
1051*4882a593Smuzhiyun
1052*4882a593SmuzhiyunNel codice specifico per un'architettura, potreste aver bisogno di codice
1053*4882a593Smuzhiyun*inline assembly* per interfacciarvi col processore o con una funzionalità
1054*4882a593Smuzhiyunspecifica della piattaforma.  Non esitate a farlo quando è necessario.
1055*4882a593SmuzhiyunComunque, non usatele gratuitamente quando il C può fare la stessa cosa.
1056*4882a593SmuzhiyunPotete e dovreste punzecchiare l'hardware in C quando è possibile.
1057*4882a593Smuzhiyun
1058*4882a593SmuzhiyunConsiderate la scrittura di una semplice funzione che racchiude pezzi comuni
1059*4882a593Smuzhiyundi codice assembler piuttosto che continuare a riscrivere delle piccole
1060*4882a593Smuzhiyunvarianti.  Ricordatevi che l' *inline assembly* può utilizzare i parametri C.
1061*4882a593Smuzhiyun
1062*4882a593SmuzhiyunIl codice assembler più corposo e non banale dovrebbe andare nei file .S,
1063*4882a593Smuzhiyuncoi rispettivi prototipi C definiti nei file d'intestazione.  I prototipi C
1064*4882a593Smuzhiyunper le funzioni assembler dovrebbero usare ``asmlinkage``.
1065*4882a593Smuzhiyun
1066*4882a593SmuzhiyunPotreste aver bisogno di marcare il vostro codice asm come volatile al fine
1067*4882a593Smuzhiyund'evitare che GCC lo rimuova quando pensa che non ci siano effetti collaterali.
1068*4882a593SmuzhiyunNon c'è sempre bisogno di farlo, e farlo quando non serve limita le
1069*4882a593Smuzhiyunottimizzazioni.
1070*4882a593Smuzhiyun
1071*4882a593SmuzhiyunQuando scrivete una singola espressione *inline assembly* contenente più
1072*4882a593Smuzhiyunistruzioni, mettete ognuna di queste istruzioni in una stringa e riga diversa;
1073*4882a593Smuzhiyunad eccezione dell'ultima stringa/istruzione, ognuna deve terminare con ``\n\t``
1074*4882a593Smuzhiyunal fine di allineare correttamente l'assembler che verrà generato:
1075*4882a593Smuzhiyun
1076*4882a593Smuzhiyun.. code-block:: c
1077*4882a593Smuzhiyun
1078*4882a593Smuzhiyun	asm ("magic %reg1, #42\n\t"
1079*4882a593Smuzhiyun	     "more_magic %reg2, %reg3"
1080*4882a593Smuzhiyun	     : /* outputs */ : /* inputs */ : /* clobbers */);
1081*4882a593Smuzhiyun
1082*4882a593Smuzhiyun21) Compilazione sotto condizione
1083*4882a593Smuzhiyun---------------------------------
1084*4882a593Smuzhiyun
1085*4882a593SmuzhiyunOvunque sia possibile, non usate le direttive condizionali del preprocessore
1086*4882a593Smuzhiyun(#if, #ifdef) nei file .c; farlo rende il codice difficile da leggere e da
1087*4882a593Smuzhiyunseguire.  Invece, usate queste direttive nei file d'intestazione per definire
1088*4882a593Smuzhiyunle funzioni usate nei file .c, fornendo i relativi stub nel caso #else,
1089*4882a593Smuzhiyune quindi chiamate queste funzioni senza condizioni di preprocessore.  Il
1090*4882a593Smuzhiyuncompilatore non produrrà alcun codice per le funzioni stub, produrrà gli
1091*4882a593Smuzhiyunstessi risultati, e la logica rimarrà semplice da seguire.
1092*4882a593Smuzhiyun
1093*4882a593SmuzhiyunÈ preferibile non compilare intere funzioni piuttosto che porzioni d'esse o
1094*4882a593Smuzhiyunporzioni d'espressioni.  Piuttosto che mettere una ifdef in un'espressione,
1095*4882a593Smuzhiyunfattorizzate parte dell'espressione, o interamente, in funzioni e applicate
1096*4882a593Smuzhiyunla direttiva condizionale su di esse.
1097*4882a593Smuzhiyun
1098*4882a593SmuzhiyunSe avete una variabile o funzione che potrebbe non essere usata in alcune
1099*4882a593Smuzhiyunconfigurazioni, e quindi il compilatore potrebbe avvisarvi circa la definizione
1100*4882a593Smuzhiyuninutilizzata, marcate questa definizione come __maybe_unused piuttosto che
1101*4882a593Smuzhiyunracchiuderla in una direttiva condizionale del preprocessore.  (Comunque,
1102*4882a593Smuzhiyunse una variabile o funzione è *sempre* inutilizzata, rimuovetela).
1103*4882a593Smuzhiyun
1104*4882a593SmuzhiyunNel codice, dov'è possibile, usate la macro IS_ENABLED per convertire i
1105*4882a593Smuzhiyunsimboli Kconfig in espressioni booleane C, e quindi usatela nelle classiche
1106*4882a593Smuzhiyuncondizioni C:
1107*4882a593Smuzhiyun
1108*4882a593Smuzhiyun.. code-block:: c
1109*4882a593Smuzhiyun
1110*4882a593Smuzhiyun	if (IS_ENABLED(CONFIG_SOMETHING)) {
1111*4882a593Smuzhiyun		...
1112*4882a593Smuzhiyun	}
1113*4882a593Smuzhiyun
1114*4882a593SmuzhiyunIl compilatore valuterà la condizione come costante (constant-fold), e quindi
1115*4882a593Smuzhiyunincluderà o escluderà il blocco di codice come se fosse in un #ifdef, quindi
1116*4882a593Smuzhiyunnon ne aumenterà il tempo di esecuzione.  Tuttavia, questo permette al
1117*4882a593Smuzhiyuncompilatore C di vedere il codice nel blocco condizionale e verificarne la
1118*4882a593Smuzhiyuncorrettezza (sintassi, tipi, riferimenti ai simboli, eccetera).  Quindi
1119*4882a593Smuzhiyundovete comunque utilizzare #ifdef se il codice nel blocco condizionale esiste
1120*4882a593Smuzhiyunsolo quando la condizione è soddisfatta.
1121*4882a593Smuzhiyun
1122*4882a593SmuzhiyunAlla fine di un blocco corposo di #if o #ifdef (più di alcune linee),
1123*4882a593Smuzhiyunmettete un commento sulla stessa riga di #endif, annotando la condizione
1124*4882a593Smuzhiyunche termina.  Per esempio:
1125*4882a593Smuzhiyun
1126*4882a593Smuzhiyun.. code-block:: c
1127*4882a593Smuzhiyun
1128*4882a593Smuzhiyun	#ifdef CONFIG_SOMETHING
1129*4882a593Smuzhiyun	...
1130*4882a593Smuzhiyun	#endif /* CONFIG_SOMETHING */
1131*4882a593Smuzhiyun
1132*4882a593SmuzhiyunAppendice I) riferimenti
1133*4882a593Smuzhiyun------------------------
1134*4882a593Smuzhiyun
1135*4882a593SmuzhiyunThe C Programming Language, Second Edition
1136*4882a593Smuzhiyunby Brian W. Kernighan and Dennis M. Ritchie.
1137*4882a593SmuzhiyunPrentice Hall, Inc., 1988.
1138*4882a593SmuzhiyunISBN 0-13-110362-8 (paperback), 0-13-110370-9 (hardback).
1139*4882a593Smuzhiyun
1140*4882a593SmuzhiyunThe Practice of Programming
1141*4882a593Smuzhiyunby Brian W. Kernighan and Rob Pike.
1142*4882a593SmuzhiyunAddison-Wesley, Inc., 1999.
1143*4882a593SmuzhiyunISBN 0-201-61586-X.
1144*4882a593Smuzhiyun
1145*4882a593SmuzhiyunManuali GNU - nei casi in cui sono compatibili con K&R e questo documento -
1146*4882a593Smuzhiyunper indent, cpp, gcc e i suoi dettagli interni, tutto disponibile qui
1147*4882a593Smuzhiyunhttp://www.gnu.org/manual/
1148*4882a593Smuzhiyun
1149*4882a593SmuzhiyunWG14 è il gruppo internazionale di standardizzazione per il linguaggio C,
1150*4882a593SmuzhiyunURL: http://www.open-std.org/JTC1/SC22/WG14/
1151*4882a593Smuzhiyun
1152*4882a593SmuzhiyunKernel process/coding-style.rst, by greg@kroah.com at OLS 2002:
1153*4882a593Smuzhiyunhttp://www.kroah.com/linux/talks/ols_2002_kernel_codingstyle_talk/html/
1154