cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

coding-style.rst (43465B)


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