C99

En 1999, le C a connu une évolution majeure. Ce C a un aspect différent du C Ansi .

La nouveuté la plus remarquable est que les variables automatiques ont une portée liée au bloc ou à l’instruction de contrôle où elles sont définies, on n’est plus obligé de déclarer toutes les variables en tête de fonction.

De sorte le programme ANSI C suivant

#include <stdio.h>

int main() {
    int i, j;
    int a ;

    a = 42;

    if(a == 42) {
        for(i = 0 ; i < a ; i++) {
            for(j = 0; j < 3 ; j++) {
                printf("%d", a);
            }
        }
    }
}

Peut être réecrit ainsi en C99

#include <stdio.h>

int main() {
    int a = 42;

    if(a == 42) { // A noter qu'en C++17 on peut écrire if(int a = 42; a == 42) {}
        for(int i = 0 ; i < a ; i++) {
            for(int j = 0; j < 3 ; j++) {
                printf("%d", a);
            }
        }
    }
}

Incompatibilités avec le C++

Le C ANSI avait déjà quelques incompatibilités avec le C++, le C99 en a apporté de nombreuses nouvelles, que même le C++23 n’a pas comblé, en particulier les pointeurs restrict ou les valeurs aggrégées .