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