Le langage C a encore de beaux jours devant lui. Référence faite à un sondage paru sur cette plateforme en janvier de cette année, quatre raisons permettent de soutenir cette affirmation. Primo, n’en déplaise à ses détracteurs, C est encore largement utilisé. Secundo, il sera toujours nécessaire d’être à même de faire « joujou » de façon aisée avec le hardware et pour des tâches de ce type, le langage C continue de faire partie des premiers choix. Tertio, le langage est reconnu pour l’efficacité de son code source. Enfin, le langage se prête bien aux tâches de développement d’applications multiplateformes, ce à quoi les férus font souvent référence en parlant de portabilité.
Le langage C dispose d’un atout supplémentaire dans sa manche : il continue d’évoluer. C++ est né en 1983 pour répondre à ce besoin et connait des mises à jour régulières : C++11, C++14 puis C++17, des révisions qui ont respectivement vu le jour en 2011, 2014 et 2017. Il faudra désormais compter avec C-for-All dont l’université de Waterloo a publié la liste des extensions qui en font un C ISO qui continuera de traverser les âges.
C-for-All propose la gestion des exceptions comme extension à l’ISO C. La fonctionnalité dérive d’une thèse de génie informatique de 2017.
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | exception_t E {}; // exception type void f(...) { ... throw E{}; ... // termination ... throwResume E{}; ... // resumption } try { f(...); } catch( E e ; boolean-predicate ) { // termination handler // recover and continue } catchResume( E e ; boolean-predicate ) { // resumption handler // repair and return } finally { // always executed } |
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | // selection based on type and number of parameters void f( void ); // (1) void f( char ); // (2) void f( int, double ); // (3) f(); // select (1) f( 'a' ); // select (2) f( 3, 5.2 ); // select (3) // selection based on type and number of returns char f( int ); // (1) double f( int ); // (2) [ int, double ] f( int ); // (3) char c = f( 3 ); // select (1) double d = f( 4 ); // select (2) [ int, double ] t = f( 5 ); // select (3) |
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 | int ++?( int op ); // unary prefix increment int ?++( int op ); // unary postfix increment int ?+?( int op1, int op2 ); // binary plus int ?<=?( int op1, int op2 ); // binary less than int ?=?( int * op1, int op2 ); // binary assignment int ?+=?( int * op1, int op2 ); // binary plus-assignment struct S { int i, j; }; S ?+?( S op1, S op2 ) { // add two structures return (S){ op1.i + op2.i, op1.j + op2.j }; } S s1 = { 1, 2 }, s2 = { 2, 3 }, s3; s3 = s1 + s2; // compute sum: s3 == { 2, 5 } |
Code : | Sélectionner tout |
1 2 | short int MAX = ...; int MAX = ...; double MAX = ...; short int s = MAX; int i = MAX; double d = MAX; // select MAX based on left-hand type |
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 | choose ( ... ) { case 3: if ( ... ) { ... fallthru; // goto case 4 } else { ... } // implicit break case 4: |
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 | choose ( ... ) { case 3: ... fallthrough common; case 4: ... fallthrough common; common: // below fallthrough at case level ... // common code for cases 3 and 4 // implicit break case 4: |
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 | choose ( ... ) { case 3: choose ( ... ) { case 4: for ( ... ) { ... fallthru common; // multi-level transfer } ... } ... common: // below fallthrough at case-clause level |
Source
uWaterloo
Votre opinion
Que pensez-vous de C-for-All ?
Quelles sont d’après vous les extensions qui sont les bienvenues ?
Quelles sont celles qui n’ont aucun impact sur la productivité ? Pourquoi ?
Voir aussi
Quel avenir pour le langage C ? Un développeur expérimenté fait ses adieux au langage et livre ses inquiétudes quant à son avenir