STB1019 / SkullOfSummer

Learn stuff with less 7-days
Apache License 2.0
5 stars 0 forks source link

problematiche circa le direttive al preprocessore #9

Closed Koldar closed 7 years ago

Koldar commented 7 years ago
  1. "Direttive al Preprocessore" invece di "Direttive Al Preprocessore" (la "a" minuscola ;) );
  2. "Di fatto si permette di direzionare il compilatore verso il risultato desiderato" togliere il "si";
  3. "particolare attenzione ai file header non-predefiniti,magari nella stessa cartella del vostro progetto C": nella direttiva preprocessore "#include" non hai spiegato la differenza tra #include "something.h" e #include . Nel GCC, #include "something.h" cerca i file header prima nella CWD (ed eventualmente nei path specificati da "-I", poi nei percorsi di systema (per esempio /usr/local/include). La direttiva #include invece cerca direttamente nei percorsi di sistema. (vedi link );
  4. Sempre in "#include", mostra un esempio di codice non preprocessato e di codice preprocessato (gcc -E mycode.c);
  5. fine riga un carattere "" il carattere tra quotes deve essere "\";
  6. Nella sezione "guardie": non dire che è un problema di ereditarietà multipla. Le guardie risolvono il problema per evitare di sostituire in un file .c lo stesso header più volte. Per esempio se "b.h" contiene "a.h" e "a.h" contiene "b.h" se io incluso in "c.c" l'header "a.h" se non avessi le guardie io inserire dentro "c.c" codice infinito (oltre ad avere un errore di compilazione)! Le guardie permettono di risolvere questo problema. Anche non avendo inclusione ciclica di header, se io definisco un typedef struct in un header, dopo devo evitare di stampare lo stesso typedef più volte (da errore di compilazione!)
  7. Sempre nelle guardie, non usare il concetto di ridefinizione di macro come motivo per usare le guardie, perché le macro possono essere tranquillamente ridefinite. Adduci come motivazioni quelle specificate nel punto 6 piuttosto; Il seguente codice spiega il motivo:
#include <stdio.h>

#define CIAO 6
#define CIAO 7

typedef struct foo {
    int a;
    long b;
} foo;

typedef struct foo {
    int a;
    long b;
} foo;

int main() {
    foo f;
    f.b = 12;
    printf("%d\n", f.b);
}
  1. per le pragma: evidenzia, magari con il grassetto, che dipendono dal compilatore e non appartengono allo standard C99;
  2. Ti sei dimenticato 2 direttive: #error e #line. La documentazione relativa è in standard C99: per "#error" guarda la sezione 6.10.5 mentre per "#line" è 6.10.4;
  3. Ultima cosa: tratta anche delle macro predefinite (6.10.8 nello standard C99). Cita cosa fanno le più importanti, ossia FILE, DATE, LINE, TIME, __STDC_VERSION e la macro definita func__ (che però non è nello standard ma è definita nel gcc!)
majik00027 commented 7 years ago
  1. check
  2. check(paragrafo aggiunto appena prima della sezione define) 3.check(vedi (2))
  3. check(vedi la sezione finale sul flag -E) 6.check: sezione corretta(esempi inclusi),
  4. riferimenti a ridefinizione di macro rimossi(vedi sezione corretta #guardie) 8.check(problema di formattazione con la sintassi attribute: mi fà italic quando non dovrebbe, proposta soluzione che però può indurre a una scorretta scrittura. 9.Aggiunta sezione prima delle fonti(e link nelle fonti) 10.Aggiunta sezione prima delle fonti(e link nelle fonti)
Koldar commented 7 years ago

Nelle guardie astai ancora adducendi come motiviazioni la ridefinizione di macro e l'"ereditarietà multipla". Non è quello il motivo per cui si usano le guardie. Prendi i punt 6 e 7 del mio precedente commento.