• [^] # Re: ==

    Posté par (site web personnel) . En réponse au journal OSv : l'OS pour les nuages. Évalué à 3.

    Ça compile, parce que c'est une fonction sans prototype dont type ne sont pas testé à la compilation.
    Donc bar met des int sur la stack (ou dans les registre) et foo les interprette comme des double et donc ça donne n'importe quoi comme résultat.
    Le code en C++ interdit la syntaxe K&R, donc tu ne peux pas écrire la même chose en C++.

    Autre exemple:

    struct A { int i; }; struct B { int i; };
    int foo(struct A *a, struct B *b) {
     a->i = 108;
     b->i = 45;
     printf("%d\n", a->i);
    }
    int main() {
     int i;
     void *q = &i;
     foo(q, q);
    }

    C++ ne compilera pas ce code car on ne peux pas caster implicitment par void* en C++. Alors qu'on fait tout le temps ça en C.
    Et d'après toi, qu'est-ce que ce programme affiche ? Tu penses 45 peut être, puisque a et b pointent vers le même entiers. Mais pourtant gcc -O2 m'affiche 108. (Voilà ce qui arrive quand on fait de l'alias de type)