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