{"id":83,"date":"2015-02-20T09:20:35","date_gmt":"2015-02-20T09:20:35","guid":{"rendered":"http:\/\/anthroponaute.fr\/blog-informatique\/?p=83"},"modified":"2016-08-05T17:03:37","modified_gmt":"2016-08-05T17:03:37","slug":"83","status":"publish","type":"post","link":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/?p=83","title":{"rendered":"Astuces pour bien coder en C++"},"content":{"rendered":"<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/02\/C-unofficial.sh-600x600.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone  wp-image-92\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/02\/C-unofficial.sh-600x600-300x300.png\" alt=\"C++-unofficial.sh-600x600\" width=\"187\" height=\"187\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/02\/C-unofficial.sh-600x600-300x300.png 300w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/02\/C-unofficial.sh-600x600-150x150.png 150w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/02\/C-unofficial.sh-600x600.png 600w\" sizes=\"(max-width: 187px) 100vw, 187px\" \/><\/a><\/p>\n<p><strong>Intro :<\/strong><\/p>\n<p>Voici quelques astuces qui vous permettrons de mieux vous organiser dans l&rsquo;\u00e9tape d&rsquo;\u00e9criture de votre code.<\/p>\n<p><strong>Safe Delete :<\/strong><\/p>\n<p>Pour d\u00e9truire correctement vos objets instanci\u00e9s, vous pouvez utiliser ces macros :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\n#define SAFE_DELETE(a) { delete (a); (a) = nullptr; }\r\n#define SAFE_RELEASE(x) { x-&gt;Release();  (x) = nullptr; }\r\n\r\nSAFE_DELETE(a);\r\nSAFFE_RELEASE(x);\r\n\r\n<\/pre>\n<p><strong><br \/>\nFichier de d\u00e9claration de defines :<\/strong><\/p>\n<p>Utiliser un fichier include (<strong>Defines.h<\/strong>) o\u00f9 vous mettrez toutes vos d\u00e9clarations de defines.<br \/>\nPar principe il vaut mieux\u00a0 regrouper ensemble tout ce qui se ressemble.<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\n#define FIRST_PERSON_CAMERA_SPEED 3.0f\r\n#define OGRE_RENDER_SYSTEM_NAME &quot;Direct3D9 Rendering Subsystem&quot;\r\n#define TIME_FADE_ANNOUNCE 2.0f\r\n#define GAME_VERSION_REVISION &quot;2323&quot;\r\n#define GAME_VERSION_MINOR &quot;1&quot;\r\n#define GAME_VERSION_MAJOR &quot;0&quot;\r\n\r\n<\/pre>\n<p><strong><br \/>\nCommentaires :<\/strong><\/p>\n<p>En g\u00e9n\u00e9ral il vaut mieux bien nommer correctement les noms des variables et des fonctions<br \/>\nplut\u00f4t que de mettre des commentaires partout.<\/p>\n<p>\u00ab\u00a0Really good code comments itself\u00a0\u00bb :<\/p>\n<p><strong>Sortie de texte pour d\u00e9bugger :<\/strong><\/p>\n<p>Sous Visual Studio on peut utiliser :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nOutputDebugString(_T(&quot;text&quot;));\r\n\r\n<\/pre>\n<p>Cela permettra au programme d&rsquo;\u00e9criture sur la sortie debug de VC++.<\/p>\n<p><strong><br \/>\nEn-t\u00eate :<\/strong><\/p>\n<p>Pour expliquer et situer le r\u00f4le d&rsquo;un fichier source vous pouvez cr\u00e9er une en-t\u00eate dans chaque fichier :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\n\/\/----------------------------------------------------\r\n\/\/ Auteur : Cl\u00e9ment Profit\r\n\/\/ Nom du fichier : Console.cpp\r\n\/\/ Date de cr\u00e9ation : Juillet 2014\r\n\/\/ Description : Une console quake-like avec commandes et\r\n\/\/ appels d'events\r\n\/\/----------------------------------------------------\r\n\r\n<\/pre>\n<p>Pour expliquer et situer le r\u00f4le d&rsquo;une m\u00e9thode :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\n\/\/--------------------------------------------------\r\n\/\/ EventManager::Trigger\r\n\/\/--------------------------------------------------\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>Principes :<\/strong><\/p>\n<p><strong>1 &#8211;<\/strong> ne jamais arr\u00eater son travail quand le programme ne fonctionne pas ou lorsqu&rsquo;il ne compile pas. En effet lors de la reprise ult\u00e9rieure de votre travail vous aurez pas de bug(s) \u00e0 corriger que vous aurez oubli\u00e9s de r\u00e9soudre.<\/p>\n<p><strong>2 &#8211;<\/strong> pensez \u00e0 abuser l\u2019utilisation des macros lorsque votre code devient r\u00e9p\u00e9titif.<\/p>\n<p><strong>Macro pr\u00e9d\u00e9finies :<\/strong><\/p>\n<p>Nom de la fonction courante :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\n#if defined(_MSC_VER)\r\n\u00a0\u00a0\u00a0 #define CURRENT_FUNCTION_NAME __FUNCTION__\r\n#elif defined(__GNUC__) &amp;&amp; (__GNUC__ &gt;= 3 )\r\n\u00a0\u00a0\u00a0 #define CURRENT_FUNCTION_NAME __PRETTY_FUNCTION__\r\n#else\r\n\u00a0\u00a0\u00a0 #define CURRENT_FUNCTION_NAME &quot;Unknown function&quot;\r\n#endif\r\n<\/pre>\n<p>Pour le reste voir l&rsquo;article <a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/?p=416\">Pr\u00e9processeur<\/a><\/p>\n<p><strong>Assertions :<\/strong><\/p>\n<p>Utiliser ces assertions un peu partout dans votre code.<br \/>\nL&rsquo;instruction asm <strong>{ int 3 }<\/strong> indiquera au d\u00e9bogueur un point d&rsquo;arr\u00eat pr\u00e8s de l&rsquo;assertion en cause.<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\n#ifndef ASSERT_H\r\n#define ASSERT_H\r\n\r\n#ifndef NDEBUG\r\n\r\n#define AssertMsg(expr, msg) if (!(expr)) { std::wout &lt;&lt; (#expr &lt;&lt; &quot; &quot; &lt;&lt; __FILE__ &lt;&lt; &quot; &quot; &lt;&lt; __LINE__ &lt;&lt; &quot; &quot; &lt;&lt; CURRENT_FUNCTION_NAME &lt;&lt; &quot; &quot; &lt;&lt; msg &lt;&lt; std::endl); __asm { int 3 } }\r\n#define AssertNULLPointer(pointer) if (pointer == NULL) { AssertMsg(pointer, #pointer &quot; == NULL&quot;); __asm { int 3 } }\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\r\n#else \/\/! non-debug\r\n\r\n#define AssertMsg(expr, msg) fastprint(msg);\r\n#define SKIP_IF_FAILED_AssertMsg(expr, msg) if (expr)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n#endif\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n#endif\r\n\r\n<\/pre>\n<p><strong>Notations :<\/strong><\/p>\n<p>Utiliser la notation hongroise pour noter vos variables et vos noms de fonctions :<\/p>\n<p>g : utiliser pour les variables globales &#8211; g_counter<br \/>\nm : utiliser pour les variables membres &#8211; m_counter<br \/>\np : utiliser pour les variables pointeurs &#8211; m_pActor<br \/>\nV : utiliser pour les fonctions virtuelles &#8211; VDraw()<br \/>\nI : utiliser pour les classes interfaces &#8211; class IDrawable<\/p>\n<p>Exemple :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\nOgre::OverlayManager* m_pOverlayManager;\r\nOgre::Overlay* m_pOverlayConsole;\r\nOgre::OverlayContainer* m_pPromptImage;\r\n\r\nstd::string m_sCurrentCommmandLine;\r\nstd::string m_sPrompt;\r\n\r\nfloat m_fScrollYOffset;\r\nfloat m_fHeight;\r\nfloat m_fWidth;\r\nfloat m_fCharWidth;\r\n\r\n<\/pre>\n<p>Les diff\u00e9rents types de style de codage peuvent \u00eatre source de conflit entre programmeurs.<\/p>\n<p>L&rsquo;important est d&rsquo;\u00eatre<strong> r\u00e9gulier<\/strong> dans la beaut\u00e9 de la syntaxe,<br \/>\npeu importe quel style \/ norme de codage vous employez.<\/p>\n<p>Utiliser des raccourcis pour vos classes singletons :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\n#define EVENT_MANAGER EventManager::getSingletonPtr()\r\n\r\n<\/pre>\n<p><strong><br \/>\nMacro fastprint(texte) :<\/strong><\/p>\n<p>Pour imprimer du texte ou une variable rapidement (la macro supporte du texte \u00ab\u00a0wide string\u00a0\u00bb c&rsquo;est-\u00e0-dire supportant l&rsquo;alphabet fran\u00e7ais contrairement \u00e0 printf ou \u00e0 std::cout).<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\n#define fastprint(msg) std::wcout &lt;&lt; #msg &quot; = &quot; &lt;&lt; msg &lt;&lt; std::endl;\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>Macro debugprint(texte) :<\/strong><\/p>\n<p>Pour d\u00e9boguer vos applications on se sert de cette macro pour afficher facilement une variable<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#define debugprint(msg) std::cout &lt;&lt; msg &lt;&lt; &quot; = &quot; &lt;&lt; std::endl;\r\n<\/pre>\n<p>(todo mulitples param\u00e8tres)<\/p>\n<p>&nbsp;<\/p>\n<p><strong>Constructeur :<\/strong><\/p>\n<p>Ne jamais faire \u00e9chouer l&rsquo;initialisation d&rsquo;un objet dans son constructeur.<br \/>\nD\u00e9finissez une m\u00e9thode <strong>bool Initialize()<\/strong> \u00e0 la place (qui peut \u00e9chou\u00e9e quant-\u00e0-elle) que vous appelez juste apr\u00e8s le \u00ab\u00a0new\u00a0\u00bb et qui renvoit un bool\u00e9en indiquant si ou non l&rsquo;initialisation de l&rsquo;objet \u00e0 \u00e9chou\u00e9e.<\/p>\n<p><strong>DXTrace :<\/strong><\/p>\n<p>Pour afficher \u00e9ventuellement une erreur DirectX, on peut utiliser cette macro :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#if defined(DEBUG) | defined(_DEBUG)\r\n\u00a0\u00a0 \u00a0#ifndef HR\r\n\u00a0\u00a0 \u00a0#define HR(x)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \\\r\n\u00a0\u00a0 \u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \\\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0HRESULT hr = x;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \\\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if(FAILED(hr))\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \\\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \\\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0DXTrace(__FILE__, __LINE__, hr, #x, TRUE); \\\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \\\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0#endif\r\n\r\n#else\r\n\u00a0\u00a0 \u00a0#ifndef HR\r\n\u00a0\u00a0 \u00a0#define HR(x) x;\r\n\u00a0\u00a0 \u00a0#endif\r\n#endif\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>Const correctness\u00a0 <\/strong>:<\/p>\n<p>&nbsp;<\/p>\n<p><strong>Faire une pause dans le programme : <\/strong><\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\n#define WAIT_PROCESS int i; std::cin &gt;&gt; i; \/\/ Ne pas utiliser system(&quot;pause&quot;); !\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>Utilisation de la fen\u00eatre<em> Outline<\/em> de Visual Studio C++<\/strong> :<\/p>\n<p>Il est ais\u00e9 de naviguer \u00e0 travers les m\u00e9thode de vos classe avec cette fen\u00eatre.<\/p>\n<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/02\/outlines.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-4262\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/02\/outlines.png\" alt=\"outlines\" width=\"338\" height=\"663\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/02\/outlines.png 338w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/02\/outlines-153x300.png 153w\" sizes=\"(max-width: 338px) 100vw, 338px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p><strong>Bien choisir la taille de ses types :<\/strong><\/p>\n<p>Utilisez <em><strong>uint16<\/strong> <\/em>\u00e0 la place de <em><strong>uint32<\/strong> <\/em>quand cela est possible, cela r\u00e9duira la taille consomm\u00e9e par votre programme \u00e0 l&rsquo;ex\u00e9cution. Vous pouvez continuer \u00e0 utiliser <em><strong>uint32<\/strong> <\/em>lorsque que la variable est utilis\u00e9e temporairement (par exemple dans les boucles), en effet il n&rsquo;est pas important d&rsquo;utiliser des variables de type <em><strong>uint16<\/strong> <\/em>sur la pile car elles sont <strong>d\u00e9truites tout de suite<\/strong> apr\u00e8s la port\u00e9e, il faut utiliser des <em><strong>uint16<\/strong> <\/em>uniquement sur le tas.<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\r\n\/\/ Apr\u00e8s avoir ignorer un bloc de code on nous propose la reprise du programme en cours\r\n#define SKIP_IF_FAILED_AssertMsg(expr, msg) if (!(expr)) \\\r\nFailedAssertMessageBox(#expr, __FILE__, __LINE__, CURRENT_FUNCTION_NAME, msg, true); \\\r\nelse\r\n\r\n<\/pre>\n<p><strong>R\u00e9sum\u00e9 : <\/strong><\/p>\n<p>Ces m\u00e9thodes permettent de faciliter le codage de vos programme et de<br \/>\nrendre le code plus clair et plus joli.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intro : Voici quelques astuces qui vous permettrons de mieux vous organiser dans l&rsquo;\u00e9tape d&rsquo;\u00e9criture de votre code. Safe Delete : Pour d\u00e9truire correctement vos objets instanci\u00e9s, vous pouvez utiliser ces macros : Fichier de d\u00e9claration de defines : Utiliser un fichier include (Defines.h) o\u00f9 vous mettrez toutes vos d\u00e9clarations de defines. Par principe il [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[3],"tags":[],"_links":{"self":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/83"}],"collection":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=83"}],"version-history":[{"count":115,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/83\/revisions"}],"predecessor-version":[{"id":5350,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/83\/revisions\/5350"}],"wp:attachment":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=83"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=83"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=83"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}