{"id":146,"date":"2008-09-19T12:21:11","date_gmt":"2008-09-19T10:21:11","guid":{"rendered":"http:\/\/linux.leunen.com\/?p=146"},"modified":"2008-09-19T12:21:11","modified_gmt":"2008-09-19T10:21:11","slug":"c-comprendre-les-structures","status":"publish","type":"post","link":"https:\/\/www.leunen.com\/linux\/2008\/09\/c-comprendre-les-structures\/","title":{"rendered":"C++ &#8211; Comprendre les structures"},"content":{"rendered":"<p>Bien souvent, on me demande d&rsquo;expiquer la notation des structures telles que celle utilis\u00e9es dans l&rsquo;API Windows. Je sais, cela n&rsquo;a rien \u00e0 voir avec Linux sauf que Microsoft ayant tendance a rendre son code illisible parfois (ou disons plus compliqu\u00e9 pour le d\u00e9butant), je vais tenter d&rsquo;expliquer cette construction m\u00eame si on d&rsquo;\u00e9loigne un peu du C++ (les structures en C n&rsquo;ayant que peu \u00e0 voir avec celles du C++). Voici un exemple typique d&rsquo;une structure en C:<\/p>\n<pre class=\"codesource\">\r\ntypedef struct type1\r\n{\r\n  int i;\r\n  char *c;\r\n}var1, *var2;\r\n<\/pre>\n<p>Commen\u00e7ons par simplifier cette structure afin d&rsquo;y voir plus clair:<\/p>\n<pre class=\"codesource\">\r\nstruct type1\r\n{\r\n  int i;\r\n  char *c;\r\n};\r\n<\/pre>\n<p>Ceci d\u00e9finit une structure de type type1 contenant un entier i et un pointeur vers un caract\u00e8re c. Ok, jusque l\u00e0, c&rsquo;est assez simple. <\/p>\n<pre class=\"codesource\">\r\nstruct type1\r\n{\r\n  int i;\r\n  char *c;\r\n}var1;\r\n<\/pre>\n<p>Cette fois-ci nous avons d\u00e9fini une structure de type type1 et une variable var1 de type type1.<\/p>\n<p>Si vous mettez le mot-cl\u00e9 typedef devant une variable, vous changez la d\u00e9claration de la variable en une d\u00e9claration de type. Le nom de ce qui devrait \u00eatre le nom de la variable devient, \u00e0 cause du typedef, un nom de type.<\/p>\n<pre class=\"codesource\">\r\ntypedef int i;\r\n<\/pre>\n<p><em>i<\/em> devient un type \u00e9quivalent \u00e0 un <em>int<\/em>.<br \/>\nRevenons-en \u00e0 notre probl\u00e8me et voyons en quoi le typedef en modifie le sens.<\/p>\n<pre class=\"codesource\">\r\ntypedef struct type1\r\n{\r\n  int i;\r\n  char *c;\r\n}var1;\r\n<\/pre>\n<p>Ceci d\u00e9clare un type type1 et var1 qui est aussi un type mais \u00e9quivalent \u00e0 type1.<\/p>\n<pre class=\"codesource\">\r\nstruct type1\r\n{\r\n  int i;\r\n  char *c;\r\n}var1, *var2;\r\n<\/pre>\n<p>Ici, on d\u00e9finit une structure de type type1, une variable de type type1 corespondant \u00e0 la structure et une variable de type pointeur vers un type type1.<br \/>\nAjoutons le typedef:<\/p>\n<pre class=\"codesource\">\r\ntypedef struct type1\r\n{\r\n  int i;\r\n  char *c;\r\n}var1, *var2;\r\n<\/pre>\n<p>Avec le typedef, on en arrive finalement \u00e0 notre structure telle que rencontr\u00e9e fr\u00e9quemment dans l&rsquo;API Windows.<br \/>\nCette structure, pr\u00e9c\u00e9d\u00e9e de typedef, d\u00e9finit trois types. D&rsquo;abord un type type1 et un type var1 qui sont \u00e9quivalents. Ensuite on d\u00e9finit le type var2 comme \u00e9tant un pointeur vers le type type1. Remarquez qu&rsquo;on ne d\u00e9finit donc pas de variables mais bien trois types. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bien souvent, on me demande d&rsquo;expiquer la notation des structures telles que celle utilis\u00e9es dans l&rsquo;API Windows. Je sais, cela n&rsquo;a rien \u00e0 voir avec Linux sauf que Microsoft ayant tendance a rendre son code illisible parfois (ou disons plus compliqu\u00e9 pour le d\u00e9butant), je vais tenter d&rsquo;expliquer cette construction m\u00eame si on d&rsquo;\u00e9loigne un [&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\/146"}],"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=146"}],"version-history":[{"count":5,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/146\/revisions"}],"predecessor-version":[{"id":151,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/146\/revisions\/151"}],"wp:attachment":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/media?parent=146"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/categories?post=146"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/tags?post=146"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}