C1x : future version du langage C
Le nouveau Release 4.6 de GCC intègre déjà certaines de ses fonctionnalités

Le , par Melem, Expert éminent
C1x : future version du langage C
Le nouveau Release de GCC intègre déjà certaines de ses fonctionnalités

La nouvelle ne date pas d'hier, mais pour ceux qui ne sont pas encore au courant, une nouvelle version du C est en fait en cours d'élaboration et le dernier release de GCC (du 26 octobre 2011) intègre même déjà certaines de ses fonctionnalités.

Ce langage, couramment appelé C1x, est destiné à remplacer le C99, le standard actuel. Il est clair que le C99 a terriblement été un échec, notamment en raison du choix de Microsoft de ne pas le supporter. Mais ce n'est pas tout. Le C99 a peut-être aussi échoué parce qu'il n'apportait rien qui soit véritablement essentiel au langage.
Certes, les nouvelles fonctionnalités (types, commentaires, déclarations, initialisations, bibliothèque standard, etc.) étaient toutes aussi intéressantes les unes que les autres, mais aucune qui ouvre réellement de nouveaux horizons pour le langage.

Cette fois-ci, c'est différent. Parmi les nouveautés majeures, on peut citer : le contrôle des alignements en mémoire, un meilleur support d'Unicode, la normalisation des structures et unions anonymes, la normalisation des fonctions "secure" de Microsoft (et suppression définitive de la fonction gets au profit de gets_s) et le support du multithreading (<threads.h> et <stdatomic.h>). Comme d'habitude, des macros permettent de tester si telle fonctionnalité est disponible ou non dans une implémentation donnée. Par exemple, la macro __STDC_NO_THREADS__ permet de savoir si l'implémentation supporte ou non les threads.

Le dernier draft de cette norme date du 12 avril 2011 et est disponible ici.

Source : change log de GCC

Alors, qu'en pensez-vous ?
Approuvez-vous ces changements ?
En attendez-vous d'autres ?


Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :


 Poster une réponse

Avatar de matafan matafan - Membre émérite https://www.developpez.com
le 15/11/2011 à 15:19
Les no-return functions ne sont pas des fonctions void, mais des fonctions qui ne retournent pas (comme abort() ou exit()).

Pour at_quick_exit() et quick_exit(), le débat n'a pas lieu d'être puisque la fonctionnalité que tu critiques est déjà disponible en C99 et même C89 avec atexit() et exit(). at_quick_exit()/quick_exit() amènent simplement un deuxième jeu de fonctions qu'on peut utiliser quand il n'est pas pertinent d'utiliser les fonctions installées avec atexit() (et appelées en cas d'exit()).
Avatar de gangsoleil gangsoleil - Modérateur https://www.developpez.com
le 15/11/2011 à 17:00
Je me suis penche un peu plus sur les changements entre C99 et C1x, et j'avoue que le fait de rendre optionnel en C1x des choses (les VLA (tableaux a longueur variables) et les complexes) qui etaient obligatoires en C99 me laisse pantois.

En gros, j'ai un peu l'impression que la norme n'est plus une norme que chacun doit respecter, mais que c'est l'inverse : les gens n'ont pas voulu implementer les VLA, donc on les rend optionnels.

Certes, c'est un point tres complexe a integrer dans un compilateur, mais est-ce raisonnable de casser la backward compatibilite sur une norme ??
Avatar de ratomms ratomms - Membre actif https://www.developpez.com
le 21/11/2011 à 8:55
Citation Envoyé par 6-MarViN  Voir le message
alors quel interêt de balancer encore un autre standard

il ne sera plus un library à part entier.
Avatar de Traroth2 Traroth2 - Expert éminent sénior https://www.developpez.com
le 21/11/2011 à 10:17
Citation Envoyé par matafan  Voir le message
Les no-return functions ne sont pas des fonctions void, mais des fonctions qui ne retournent pas (comme abort() ou exit()).

Ah oui, vraiment ? Ce qui veut dire ? Imaginons qu'une fonction f1 appelle une fonction f2, qui est no-return. Que se passe-t-il à la fin de f2 ? Le flux d'exécution ne va pas exécuter l'instruction suivant l'appel de f2 dans f1 ? Mais alors que se passe-t-il ?
Avatar de Niark13 Niark13 - Membre éclairé https://www.developpez.com
le 21/11/2011 à 10:47
@traroth : Effectivement, le code suivant l'appel de f2 ne sera jamais exécuté, c'est déjà ce qui se passe lorsqu'on appelle exit() ou abort() :

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
 
void f2() 
{ 
    exit(0); 
} 
 
void f1() 
{ 
    f2(); 
    /* le code suivant l'appel à f2 ne sera jamais exécuté */ 
}
noreturn permettra juste d'indiquer au compilateur qu'on ne sortira jamais d'une fonction (soit parce qu'on sort du programme, soit parce qu'on rentre dans une boucle infinie inconditionnelle). Le compilateur pourra donc optimiser le code (par exemple en omettant de poser l'adresse de retour sur la pile).
Avatar de atha2 atha2 - Membre éprouvé https://www.developpez.com
le 21/11/2011 à 10:56
Citation Envoyé par Melem  Voir le message
la normalisation des structures et unions anonymes

Ça veut dire que :
Code : Sélectionner tout
1
2
3
4
5
6
 
typedef struct 
{ 
    int a; 
    int b; 
} MaStruct;
n'est pas normalisé ??
ou alors il s'agit seulement de ça :
Code : Sélectionner tout
1
2
3
4
5
6
 
struct 
{ 
    int a; 
    int b; 
} aStruct;
??
Avatar de Niark13 Niark13 - Membre éclairé https://www.developpez.com
le 21/11/2011 à 11:09
@atha2 : Je pense qu'il s'agit de pouvoir écrire

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
 
struct S 
{ 
    union 
    { 
        int i; 
        float f; 
    }; 
};
plutôt que :

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
 
struct S 
{ 
    union  
    { 
        int i; 
        float f; 
    } u; 
};
Et de pouvoir traiter les membres de l'union comme s'ils faisaient partie de la structure englobante (comme c'est le cas en C++).
Avatar de matafan matafan - Membre émérite https://www.developpez.com
le 21/11/2011 à 11:17
atha2, une structure anonymes c'est ça :
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct s1 { 
    int a; 
    int b; 
}; 
 
struct s2 { 
    int c; 
    int d; 
}; 
 
struct s12 { 
    struct s1; /* On ne nomme pas le champ */ 
    struct s2; /* On ne nomme pas le champ */ 
};
Et on peut accéder aux champs de la structure anonyme directement de cette façon :
Code : Sélectionner tout
1
2
struct s12 mys12 = { { 1, 2 }, { 3, 4 } }; 
printf("%d %d %d %d\n", mys12.a, mys12.b, mys12.c, mys12.d);
Certains compilateur les supportent déjà et c'est extrêmement pratique, par exemple pour faire "hériter" deux structures d'une structure commune et y accéder de manière transparente.

C'est aussi très pratique pour les unions, dont le nom ne sert généralement à rien (mystruct->u.myfield... Qui n'a jamais pesté en écrivant celà).
Avatar de atha2 atha2 - Membre éprouvé https://www.developpez.com
le 21/11/2011 à 20:24
@matafan et Niark13 : merci
Je pensai que le anonyme faisait référence au nom du type (comme les classes anonymes en Java par exemple) et pas au nom du champ.

Citation Envoyé par gangsoleil  Voir le message
Je me suis penche un peu plus sur les changements entre C99 et C1x, et j'avoue que le fait de rendre optionnel en C1x des choses (les VLA (tableaux a longueur variables) et les complexes) qui etaient obligatoires en C99 me laisse pantois.

En gros, j'ai un peu l'impression que la norme n'est plus une norme que chacun doit respecter, mais que c'est l'inverse : les gens n'ont pas voulu implementer les VLA, donc on les rend optionnels.

Certes, c'est un point tres complexe a integrer dans un compilateur, mais est-ce raisonnable de casser la backward compatibilite sur une norme ??

Une implémentation simple* est d'allouer dans le tas le tableau (de ce que j'ai vu, la norme ne précise pas où doit être alloué le tableau) et d'ajouter un free à la fin de la fonction / block. Franchement ça doit pas prendre plus de 10 minutes à implémenter.

*mais pas forcément efficace. Je n'ai jamais fait de benchmark pour comparer les 2 types d'allocation mais j'imagine qu'allouer sur le tas est moins efficace.
Avatar de Squisqui Squisqui - Membre expérimenté https://www.developpez.com
le 21/11/2011 à 21:21
Citation Envoyé par 6-MarViN  Voir le message
Bon c'est déja ça. Sinon scanf, quand est ce qu'il lui font la peau?

Elle est très bien cette fonction, qu'as-tu a lui reprocher en dehors du fait qu'elle soit souvent apprise à des débutants qui n'ont pas la moindre idée de comment gérer une chaîne formatée ?
Là où gets() nous obligeait à faire confiance à la chaîne entrée, scanf() peut tout contrôler, de la simple longueur de chaîne jusqu'à un modèle strict imposé par des regex.
Ça fait économiser pas mal de lignes de test, d'après moi.
Avatar de Markand Markand - Membre actif https://www.developpez.com
le 22/11/2011 à 13:21
Moi je suis déçu qu'il y ai toujours pas une gestion des répertoire de manière standard. Pourquoi ne pas mettre dirent.h dans le standard du C ?

Je pense que c'est bien plus important que les threads qui eux ont été prévus dans C1x
Offres d'emploi IT
Data scientist senior H/F
Safran - Ile de France - Magny-les-Hameaux (Saclay)
Ingénieur développement fpga (traitement vidéo) H/F
Safran - Ile de France - 100 rue de Paris 91300 MASSY
Responsable transverse - engagement métiers H/F
Safran - Ile de France - Corbeil-Essonnes (91100)

Voir plus d'offres Voir la carte des offres IT
Contacter le responsable de la rubrique Accueil