{"id":1160,"date":"2011-09-10T12:21:37","date_gmt":"2011-09-10T10:21:37","guid":{"rendered":"http:\/\/linux.leunen.com\/?p=1160"},"modified":"2011-09-10T12:21:37","modified_gmt":"2011-09-10T10:21:37","slug":"c-breve-presentation-de-c0x","status":"publish","type":"post","link":"https:\/\/www.leunen.com\/linux\/2011\/09\/c-breve-presentation-de-c0x\/","title":{"rendered":"C++ &#8211; br\u00e8ve pr\u00e9sentation de C++0x"},"content":{"rendered":"<p>Le 12 ao\u00fbt 2011, <strong>Herb Sutter<\/strong> annon\u00e7ait sur <a href=\"http:\/\/herbsutter.com\/2011\/08\/12\/we-have-an-international-standard-c0x-is-unanimously-approved\/\">son blog<\/a> que la nouvelle norme <em>C++0x<\/em> \u00e9tait approuv\u00e9e \u00e0 l&rsquo;unanimit\u00e9. La pr\u00e9c\u00e9dente norme datait de 1998 et avait juste subi une mise \u00e0 jour en 2003.<\/p>\n<p>Le compilateur <em>gcc<\/em> inclus dans Linux a commenc\u00e9 \u00e0 impl\u00e9menter les nouveaut\u00e9s de cette (future) nouvelle norme depuis la version 4.3. Notez que Ubuntu 11.04 dispose de la version 4.5 de <em>gcc<\/em> et que dans Ubuntu 11.10 \u00e0 venir, la version de <em>gcc<\/em> sera la 4.6. Il faudra attendre les versions 4.7 et suivantes pour que toutes les extensions au langage permises par la nouvelle norme apparaissent dans <em>gcc<\/em>.<\/p>\n<p>Pour pouvoir compiler un programme avec <em>gcc<\/em> en utilisant la nouvelle norme, il faut ajouter une option sur la ligne de commande de <em>g++<\/em>: <em>-std=c++0x<\/em><\/p>\n<pre class=\"codesource\">\r\n$ g++ -Wall -std=c++0x -c mon_fichier.cpp\r\n<\/pre>\n<p>Je ne vais pas d\u00e9tailler toutes les nouveaut\u00e9s de cette norme. D&rsquo;autres le font bien mieux que moi mais je voudrais juste en pr\u00e9senter quelques unes qui me semblent int\u00e9ressantes pour montrer l&rsquo;\u00e9volution du langage.<\/p>\n<p><em>C++0x<\/em> introduit les types <em>char16_t<\/em> et <em>char_32_t<\/em> non-sign\u00e9s d\u00e9finis dans le fichier d&rsquo;ent\u00eate <em>cstdint<\/em>. Ces nouveaux types seront utiles pour les caract\u00e8res <em>unicode<\/em> puisqu&rsquo;avec le type <em>char_t<\/em> sur 8 bits, on retrouve les trois tailles possibles d&rsquo;un caract\u00e8re <em>unicode<\/em>.<\/p>\n<pre class=\"codesource\">\r\n<span class=\"preprocessor\">#include &lt;iostream&gt;\r\n<\/span><span class=\"preprocessor\">#include &lt;cstdint&gt;\r\n<\/span>\r\n<span class=\"reservedname\">int<\/span> main()\r\n{\r\n  <span class=\"reservedname\">char16_t<\/span> c = 'a';\r\n  <span class=\"reservedname\">char32_t<\/span> d = 'b';\r\n  std::cout &lt;&lt; <span class=\"reservedname\">sizeof<\/span>(c) &lt;&lt; std::endl;\r\n  std::cout &lt;&lt; <span class=\"reservedname\">sizeof<\/span>(d) &lt;&lt; std::endl;   \r\n  \r\n  <span class=\"reservedname\">return<\/span> 0;\r\n}\r\n<\/pre>\n<p>L&rsquo;<em>inf\u00e9rence de type<\/em> permet au compilateur de d\u00e9duire le type d&rsquo;une variable \u00e0 partir de la fa\u00e7on dont elle est initialis\u00e9e. Utile dans des boucles ou dans le parcours de listes, de dictionaires&#8230;<\/p>\n<pre class=\"codesource\">\r\n<span class=\"reservedname\">auto<\/span> ma_variable = 10;  <span class=\"codecomment\">\/\/ ma_variable aura le type int d\u00e9fini au moment de l'initialisaton\r\n<\/span>\r\n<\/pre>\n<p>Le <em>foreach<\/em> attendu par certains appara\u00eet aussi dans <em>C++0x<\/em>. Il permet de parcourir une liste facilement.<\/p>\n<pre class=\"codesource\">\r\n<span class=\"preprocessor\">#include &lt;iostream&gt;\r\n<\/span>\r\n<span class=\"reservedname\">int<\/span> main()\r\n{\r\n  <span class=\"reservedname\">int<\/span> a[5] = {1, 2, 3, 4, 5};\r\n  <span class=\"reservedname\">for<\/span>(<span class=\"reservedname\">int<\/span> i : a)\r\n  {\r\n    std::cout&lt;&lt;i&lt;&lt;std::endl;\r\n  }  \r\n  <span class=\"reservedname\">return<\/span> 0;\r\n}\r\n<\/pre>\n<p>Le support des fonctions <em>lambdas<\/em> est aussi une des nouveaut\u00e9s. Les fonctions <em>lambdas<\/em> sont des fonctions anonymes ne n\u00e9cessitant pas de d\u00e9finition comme les fonctions habituelles et peuvant \u00eatre utilis\u00e9es directement dans le code. Elles sont d\u00e9finies par exemple de cette fa\u00e7on:<\/p>\n<pre class=\"codesource\">\r\n[](<span class=\"reservedname\">int<\/span> i, <span class=\"reservedname\">int<\/span> y)\r\n{\r\n  <span class=\"reservedname\">if<\/span>(i &gt; y)<span class=\"reservedname\">return<\/span> i;\r\n  <span class=\"reservedname\">else<\/span> <span class=\"reservedname\">return<\/span> y;\r\n}\r\n<\/pre>\n<p>Une autre nouveaut\u00e9 tr\u00e8s utile lors de cross-compilation est l&rsquo;apparition des <em>assertions statiques<\/em> disponibles au moment de la compilation et non plus comme les <em>assertions<\/em> classiques au moment de l&rsquo;ex\u00e9cution. Elles permettent de tester les types de variables et de s&rsquo;assurer, par exemple, qu&rsquo;ils ont la taille d\u00e9sir\u00e9e.<\/p>\n<pre class=\"codesource\">\r\n<span class=\"reservedname\">static_assert<\/span>(<span class=\"reservedname\">sizeof<\/span>(<span class=\"reservedname\">char16_t<\/span>) == 2, <span class=\"quotedstring\">\"char16_t doit avoir une taille de 2\"<\/span>);\r\n\r\n<span class=\"reservedname\">int<\/span> main()\r\n{\r\n    <span class=\"reservedname\">return<\/span> 0;\r\n}\r\n<\/pre>\n<p>Le pointeur <em>nullptr<\/em> est introduit qui peut prendre n&rsquo;importe quel type de pointeur ou le type bool\u00e9en. NULL par contre, est g\u00e9n\u00e9ralement d\u00e9fini comme la valeur enti\u00e8re 0.<\/p>\n<p>Autre point que je voudrais pr\u00e9senter est la possibilit\u00e9 pour un constructeur d&rsquo;une classe d&rsquo;appeler un autre constructeur de cette m\u00eame classe ce qui n&rsquo;\u00e9tait pas possible auparavant. <\/p>\n<pre class=\"codesource\">\r\n<span class=\"preprocessor\">#include &lt;iostream&gt;\r\n<\/span>\r\n<span class=\"reservedname\">class<\/span> C\r\n{\r\n  <span class=\"reservedname\">private<\/span>:\r\n    <span class=\"reservedname\">int<\/span> i;\r\n  \r\n  <span class=\"reservedname\">public<\/span>:\r\n    C(<span class=\"reservedname\">int<\/span> y){std::cout&lt;&lt;y&lt;&lt;std::endl;}\r\n    C(){C(20);}\r\n};\r\n\r\n<span class=\"reservedname\">int<\/span> main()\r\n{\r\n  C c;\r\n  <span class=\"reservedname\">return<\/span> 0;\r\n}\r\n<\/pre>\n<p>Ajoutons aussi que <em>C++0x<\/em> apporte le support des <em>threads<\/em>, des <em>tuples<\/em>, des <em>expressions r\u00e9guli\u00e8res<\/em> via une mise \u00e0 jour de la <em>Standard Template Library<\/em> et plein d&rsquo;autres choses qu&rsquo;il m&rsquo;est impossible d&rsquo;expliquer ici tant elles sont nombreuses. Mais on voit clairement que le langage s&rsquo;est modernis\u00e9 et introduit des choses qui \u00e9taient d\u00e9j\u00e0 pr\u00e9sentes dans d&rsquo;autres langages plus r\u00e9cents.<\/p>\n<p><strong>Sources:<\/strong><br \/>\n<a href=\"http:\/\/www.ibm.com\/developerworks\/aix\/library\/au-gcc\/index.html?cmp=dw&#038;cpb=dwaix&#038;ct=dwgra&#038;cr=twitter&#038;ccy=zz&#038;cr=GCC4.5\">C++0x feature support in GCC 4.5<\/a> &#8211; article sur le site d&rsquo;IBM<br \/>\n<a href=\"http:\/\/www2.research.att.com\/~bs\/C++0xFAQ.html\">C++0x faq<\/a> de Bjarne Stroustrup<br \/>\n<a href=\"http:\/\/en.wikipedia.org\/wiki\/C++0x\">C++11<\/a> &#8211; article de Wikipedia<br \/>\n<a href=\"http:\/\/www.open-std.org\/jtc1\/sc22\/wg21\/docs\/papers\/2010\/n3092.pdf\">Le draft de la future norme<\/a> &#8211; fichier pdf<br \/>\n<a href=\"http:\/\/linuxfr.org\/news\/le-standard-c0x-a-enfin-%C3%A9t%C3%A9-vot%C3%A9\">C++ Le standard C++0x a enfin \u00e9t\u00e9 vot\u00e9<\/a> &#8211; article de linuxfr.org<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Le 12 ao\u00fbt 2011, Herb Sutter annon\u00e7ait sur son blog que la nouvelle norme C++0x \u00e9tait approuv\u00e9e \u00e0 l&rsquo;unanimit\u00e9. La pr\u00e9c\u00e9dente norme datait de 1998 et avait juste subi une mise \u00e0 jour en 2003. Le compilateur gcc inclus dans Linux a commenc\u00e9 \u00e0 impl\u00e9menter les nouveaut\u00e9s de cette (future) nouvelle norme depuis la version [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[4],"tags":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/1160"}],"collection":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/comments?post=1160"}],"version-history":[{"count":5,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/1160\/revisions"}],"predecessor-version":[{"id":1165,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/1160\/revisions\/1165"}],"wp:attachment":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/media?parent=1160"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/categories?post=1160"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/tags?post=1160"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}