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