projprog/C13.md
2021-11-19 19:11:50 +01:00

1.7 KiB

C13

Exercice 2

Les typedef permettent d'assigner des types plus "précis" à des variables. Que feraient les physiciens sans leur analyse dimensionelle ? C'est un moyen de préciser ce que représentre la variable autre part que le nom. Donc en soi, c'est une sorte de documentation, puisque ça n'a pas d'effet sur le code résultant.

  1. Le typedef est juste une notation, les deux types sont complétement mélangeables, on peut donner à int à une fonction demandant du longueur sans que le runtime, ni le compilateur ne râle.
  2. Deux types créés à partir du même sont du même fait eux aussi indiscernables.
  3. Une autre utilité est de raccourcir le nom de types: par exemple pour remplacer unsigned long long int par entier, ou struct personnage* en perso.
  4. Vrai. Je ne sais pas trop quoi dire de plus.
  5. Faux. Define est une directive préprocesseur ce qui signifie que les macros créés vont être résolues avant que le compilateur effectif n'agisse. La macro va être étendue telle quel, avec possiblement des erreurs provenant de mauvais parenthésage (voir fiches posterieures). Par exemple le code suivant montre la différence :
typedef int** test;
#define tset int**

int main(){
    

    int a=2;
    int *aa=&a;
    int **aaa = &aa; // aaa est un test
    int ***aaaa = &aaa; // aaaa est un test*

    test *pouf1, pif1;// pouf1 est un int*** et pif1 un int** (test* et test)
    tset *pouf2, pif2;
    // Cette ligne est préprocécussée en `int** *pouf2, pif2`, donc pouf2 est un int***, mais pif2 est un int !
    // C'est pour cela que les assignation suivantes sont bien typées
    pouf1 = aaaa;
    pif1 = aaa;
    pouf2 = aaaa;
    pif2 = a;
}