<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>C++ on 終於明白 | tsungyi knows.</title><link>https://tsungyi.li/Blog/tags/c++/</link><description>Recent content in C++ on 終於明白 | tsungyi knows.</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Wed, 01 Mar 2023 03:10:00 +0800</lastBuildDate><atom:link href="https://tsungyi.li/Blog/tags/c++/index.xml" rel="self" type="application/rss+xml"/><item><title>C++ - User-defined literals</title><link>https://tsungyi.li/Blog/posts/cpp-user-defined-literals/</link><pubDate>Wed, 01 Mar 2023 03:10:00 +0800</pubDate><guid>https://tsungyi.li/Blog/posts/cpp-user-defined-literals/</guid><description>&lt;p&gt;C++ 11 新增 User-defined literals 可以經由程式定義的字面常量後綴，讓我們寫出可讀性更加的程式碼。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;簡單的說，我們可以透過有意義的字面常量後綴將常數或是字串轉換自訂的型別來提高可讀性。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="user-defined-literals"&gt;User-defined literals&lt;/h2&gt;
&lt;p&gt;目前 User-defined literals 支援以下 8 種語法格式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;decimal-literal ud-suffix&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;octal-literal ud-suffix&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hex-literal ud-suffix&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;binary-literal ud-suffix&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fractional-constant exponent-part ﻿(optional) ud-suffix&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;digit-sequence exponent-part ud-suffix&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;character-literal ud-suffix&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;string-literal ud-suffix&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;1-4 支援不同進位的整數格式&lt;/li&gt;
&lt;li&gt;5, 6 支援不同格式的浮點數&lt;/li&gt;
&lt;li&gt;7 支援字元格式&lt;/li&gt;
&lt;li&gt;8 支援字串格式&lt;/li&gt;
&lt;li&gt;使用者定義的 &lt;code&gt;ud-suffix&lt;/code&gt; 需要以底線 &lt;code&gt;_&lt;/code&gt; 開頭，標準函式庫中定義的則不會以底線開頭。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;編譯器在遇到 User-defined literals 的時候會依據 &lt;code&gt;ud-suffix&lt;/code&gt; 前面的文字的型別推導適當的函式進行轉換。&lt;/p&gt;
&lt;p&gt;首先會透過 unqualified name lookup 找到所有名稱符合的函式集合。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果是整數格式：
&lt;ul&gt;
&lt;li&gt;如果符合的函式集合有參數型別為 &lt;code&gt;unsigned long long&lt;/code&gt; 時，會選擇此函式並呼叫 &lt;code&gt;operator &amp;quot;&amp;quot;X(nULL)&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;否則，如果有參數型別為 &lt;code&gt;raw literal operators&lt;/code&gt; (&lt;code&gt;const char*&lt;/code&gt;)時，會選擇此函式並呼叫 &lt;code&gt;operator &amp;quot;&amp;quot;X(&amp;quot;n&amp;quot;)&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;否則，如果有參數型別為 &lt;code&gt;numeric literal operator template&lt;/code&gt; (&lt;code&gt;template&amp;lt;char ...&amp;gt; X operator &amp;quot;&amp;quot;X()&lt;/code&gt;) 時會選擇此函式並呼叫 &lt;code&gt;operator &amp;quot;&amp;quot;X&amp;lt;'C1', 'C2', ..., 'CK'&amp;gt;()&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;如果是浮點數格式：
&lt;ul&gt;
&lt;li&gt;如果符合的函式集合有參數型別為 &lt;code&gt;long double&lt;/code&gt; 時，會選擇此函式並呼叫 &lt;code&gt;operator &amp;quot;&amp;quot;X(fL)&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;否則，如果有參數型別為 &lt;code&gt;raw literal operators&lt;/code&gt; (&lt;code&gt;const char*&lt;/code&gt;)時，會選擇此函式並呼叫 &lt;code&gt;operator &amp;quot;&amp;quot;X(&amp;quot;f&amp;quot;)&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;否則，如果有參數型別為 &lt;code&gt;numeric literal operator template&lt;/code&gt; (&lt;code&gt;template&amp;lt;char ...&amp;gt; X operator &amp;quot;&amp;quot;X()&lt;/code&gt;) 時會選擇此函式並呼叫 &lt;code&gt;operator &amp;quot;&amp;quot;X&amp;lt;'C1', 'C2', ..., 'CK'&amp;gt;()&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;如果是字串格式：
&lt;ul&gt;
&lt;li&gt;(C++ 20) 如果有符合的 &lt;code&gt;non-type template parameter of class type&lt;/code&gt; (&lt;code&gt;string literal operator template&lt;/code&gt;)時，會選擇此函式並呼叫 &lt;code&gt;operator &amp;quot;&amp;quot;X&amp;lt;str&amp;gt;()&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;否則會選擇此函式並呼叫 &lt;code&gt;operator &amp;quot;&amp;quot;X (str, len)&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;如果是字元格式：
&lt;ul&gt;
&lt;li&gt;會選擇此函式並呼叫 &lt;code&gt;operator &amp;quot;&amp;quot;X(ch)&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="literal-operators--literal-operators-template"&gt;Literal operators / Literal operators template&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Literal operators 需要符合以下格式：&lt;/p&gt;</description></item><item><title>C++ - 宣告 vs. 定義</title><link>https://tsungyi.li/Blog/posts/cpp-declare-define/</link><pubDate>Mon, 29 Jun 2020 17:23:06 +0800</pubDate><guid>https://tsungyi.li/Blog/posts/cpp-declare-define/</guid><description>&lt;h1 id="declare-宣告"&gt;Declare 宣告&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;宣告是指程式中使用到某個類別或是變數之前，先讓編譯器知道該類別的名稱或是變數的類別與名稱。&lt;/li&gt;
&lt;li&gt;必須要在實際使用之前宣告。因此在標頭檔以及原始檔之中需要使用 &lt;code&gt;#include&lt;/code&gt; 這個預處理器命令將用到的類別介紹給編譯器。
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;#include&lt;/code&gt; 這個預處理器命令實際上是將引入的檔案內容取代掉 &lt;code&gt;#include&lt;/code&gt; 所在的位置，因此大量的 &lt;code&gt;#include&lt;/code&gt; 會大幅增加編譯的時間。&lt;/li&gt;
&lt;li&gt;如果只用到指標或是參考時，在標頭檔可以使用前置宣告 (Forward Declare) 的技巧來優化。（細節在 &lt;strong&gt;前置宣告&lt;/strong&gt; 小節中說明）
&lt;ul&gt;
&lt;li&gt;不呼叫該指標的方法或是使用它的成員時，編譯器不需要知道該類別的形狀，只需要當成該類型的指標變數來處理。因為指標的大小是固定的，所以不需要引入該類別也可以通過編譯。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;相同的宣告可以在專案中重複出現。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="define-定義"&gt;Define 定義&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;定義是編譯器提供類型實作細節的地方，以及配置變數記憶體的語句。
&lt;ul&gt;
&lt;li&gt;因為定義變數時需要配置記憶體在 stack 上，因此編譯器在此時必須要知道此類別的記憶體佈局（成員的順序與類型、記憶體對齊方式等&amp;hellip;）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;與宣告不同的是，定義在程式中只能出現一次。重複定義會造成錯誤。
&lt;ul&gt;
&lt;li&gt;同一個轉換單元（Translation Unit）之中只能定義一次，否則會有編譯錯誤。&lt;/li&gt;
&lt;li&gt;同專案中不同轉換單元之中也只能定義一次，否則會有連結錯誤。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;所有程式中有用到的實體（變數、函式&amp;hellip;）都必須也只能在其中一個轉換單元中定義，否則會有連結錯誤。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="extern-關鍵字"&gt;&lt;code&gt;extern&lt;/code&gt; 關鍵字&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;在多個轉換單元之間，如果要使用同一個變數的實例可以將變數宣告為外部引用（extern），讓編譯器在連結期再把實際的變數實例連結到使用的程式碼。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="forward-declare-前置宣告"&gt;Forward Declare 前置宣告&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;需要使用前置宣告通常有兩種原因
&lt;ol&gt;
&lt;li&gt;因為編譯器必須先看到類別、函式的宣告才能在接下來的程式中使用，一但出現互相引用的狀況編譯器就無法處理。例如底下兩個程式碼就無法編譯：&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TestFunction&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; TestClass test; &lt;span style="color:#75715e"&gt;// error: unknown type name &amp;#39;TestClass&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TestClass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; Test()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; TestFunction();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TestClass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; Test()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; TestFunction(); &lt;span style="color:#75715e"&gt;// error: use of undeclared identifier &amp;#39;TestFunction&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TestFunction&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; TestClass test;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;不論是先定義 TestFunction 還是先定義 TestClass，都會在使用到對方的程式碼的時候發生編譯錯誤。&lt;/li&gt;
&lt;li&gt;前置宣告的作法就是把其中一個的定義語法改成宣告語法，先讓編譯器知道名稱、型別資訊來避免編譯錯誤。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TestFunction&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;// NOTE: Forward declare
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TestClass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; Test()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; TestFunction();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TestFunction&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; TestClass test;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;
&lt;li&gt;更常見的原因是為了提升編譯速度。當某個類別的方法參數、成員變數需要其他型別時，我們就需要在標頭檔之中引用其他標頭檔。因為 #include 是將引用的檔案展開到 #include 的位置，當引入的數量很多的時候會有大量的 IO 發生。通常標頭檔還會被其他檔案引用，造成倍數的成長。
&lt;ul&gt;
&lt;li&gt;如果是方法的參數或是成員變數用到指標或是參考時，編譯器要知道保留多少空間來儲存這個參數。幸運的是指標或是參考的大小都是固定的，因此編譯器並不需要知道整個類別的記憶體佈局。所以使用前置宣告可以減少需要引入的標頭檔數量。&lt;/li&gt;
&lt;li&gt;減少需要引入的標頭檔數量還可以減少因為修改檔案時需要重新編譯的檔案數量。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="前置宣告的缺點"&gt;前置宣告的缺點&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;根據 &lt;a href="https://google.github.io/styleguide/cppguide.html"&gt;Google C++ Style Guide&lt;/a&gt; 並不建議使用前置宣告。&lt;/li&gt;
&lt;li&gt;使用前置宣告可能造成對 incomplete type 的操作，這在 C++ 標準是未定義行為(Undefine Behaviour)，因此無法保證程式是否能更正確運行。
&lt;ul&gt;
&lt;li&gt;在 #include 該型別的定義之前絕對不要對該型別做操作。
&lt;ul&gt;
&lt;li&gt;大部分的情況部會有問題，而且誤用時也會有編譯錯誤。但是像是 delete 指標、將指標當成參數是可以通過編譯的（會有警告）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ref: &lt;a href="https://docs.microsoft.com/zh-tw/cpp/cpp/declarations-and-definitions-cpp?view=vs-2019"&gt;https://docs.microsoft.com/zh-tw/cpp/cpp/declarations-and-definitions-cpp?view=vs-2019&lt;/a&gt;&lt;/p&gt;</description></item><item><title>C++ - 命名規則</title><link>https://tsungyi.li/Blog/posts/cpp-naming/</link><pubDate>Mon, 29 Jun 2020 14:13:50 +0800</pubDate><guid>https://tsungyi.li/Blog/posts/cpp-naming/</guid><description>&lt;h1 id="general-rule"&gt;General Rule&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;程式中的所有類別、變數、函式&amp;hellip;的命名請務必使用讓人看到名稱就可以了解他的用途。
&lt;ul&gt;
&lt;li&gt;使用註解來解釋是不得已的作法，請盡量避免。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;名稱的長度沒有限制，但是請以人類容易閱讀、記憶的原則命名，過長或過短的名稱都不適當。
&lt;ul&gt;
&lt;li&gt;避免無法發音的名稱或是外語的羅馬拼音，除非這是所有成員都理解的專有名稱或是 &lt;strong&gt;領域用語&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;不要使用自創的縮寫。&lt;/li&gt;
&lt;li&gt;使用縮寫請確保團隊成員都清楚縮寫的意義。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;命名時請考慮使用共同的 &lt;strong&gt;領域用語&lt;/strong&gt;，降低與其他成員溝通的成本。
&lt;ul&gt;
&lt;li&gt;團隊應該建立自己的 &lt;strong&gt;字彙表&lt;/strong&gt; 提供團隊成員查詢專案使用的 &lt;strong&gt;領域用語&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="引用防護include-guard命名"&gt;引用防護（include guard）命名&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;使用 ALL_CAPS （全大寫命名法）命名。命名規則使用檔案完整路徑並且加上 &lt;code&gt;__&lt;/code&gt; 前綴。（Ex. &lt;code&gt;__BATTLE_FLElD_H&lt;/code&gt;）
&lt;ul&gt;
&lt;li&gt;建議改用 &lt;code&gt;#pragma once&lt;/code&gt; 取代引用防護，編譯器能對 &lt;code&gt;#pragma once&lt;/code&gt; 做較好的最佳化。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="全域變數命名"&gt;全域變數命名&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;使用 lower camel case （小駝峰式命名法）命名，並且加上 &lt;code&gt;g_&lt;/code&gt; 前綴。（Ex. &lt;code&gt;bool g_battleField&lt;/code&gt;）
&lt;ul&gt;
&lt;li&gt;請避免使用全域變數。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="區域變數命名"&gt;區域變數命名&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;使用 lower camel case （小駝峰式命名法）命名。（Ex. &lt;code&gt;bool battleField&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="常數命名"&gt;常數命名&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;使用 ALL_CAPS （全大寫命名法）命名。（Ex. &lt;code&gt;const bool BATTLE_FLAG&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="命名空間命名"&gt;命名空間命名&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;使用 upper camel case （大駝峰式命名法）命名。（Ex. &lt;code&gt;namespace BattleField&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="函式命名"&gt;函式命名&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;函式使用 lower camel case （小駝峰式命名法）命名。（Ex. &lt;code&gt;void battleFunction()&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;參數使用 lower camel case （小駝峰式命名法）命名。（Ex. &lt;code&gt;void battleFunction(bool battleFlag)&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="列舉命名"&gt;列舉命名&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;使用 upper camel case （大駝峰式命名法）命名。（Ex. &lt;code&gt;enum BattleField&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="列舉值命名"&gt;列舉值命名&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;使用 upper camel case （大駝峰式命名法）命名。（Ex. &lt;code&gt;Empty = 0&lt;/code&gt;）
&lt;ul&gt;
&lt;li&gt;盡量給所有列舉值初始值，避免程式改動後數值錯亂。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;命名時請不要重複列舉的名稱。
&lt;ul&gt;
&lt;li&gt;GOOD: &lt;code&gt;enum BattleField { Empty = 0, Full = 1, };&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;BAD: &lt;code&gt;enum BattleField { BattleFieldEmpty, BattleFieldFull, };&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="類別命名"&gt;類別命名&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;使用 upper camel case （大駝峰式命名法）命名。（Ex. &lt;code&gt;class BattleField&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="類別成員命名"&gt;類別成員命名&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;public 成員使用 lower camel case （小駝峰式命名法）命名 （Ex. &lt;code&gt;bool battleFlag&lt;/code&gt;）。
&lt;ul&gt;
&lt;li&gt;請只在 struct 中使用 public 成員。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;protected 、 private 成員使用 lower camel case （小駝峰式命名法）命名，並且加上 &lt;code&gt;_&lt;/code&gt; 前綴。（Ex. &lt;code&gt;bool _battleFlag&lt;/code&gt;）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="類別方法類別靜態方法命名"&gt;類別方法/類別靜態方法命名&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;函式使用 lower camel case （小駝峰式命名法）命名 （Ex. &lt;code&gt;void battleFunction()&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;參數使用 lower camel case （小駝峰式命名法）命名 （Ex. &lt;code&gt;void battleFunction(bool battleFlag)&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="類別靜態成員命名"&gt;類別靜態成員命名&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;使用 lower camel case （小駝峰式命名法）命名，並且加上 &lt;code&gt;s_&lt;/code&gt; 前綴。 （Ex. &lt;code&gt;static bool s_battleFlag&lt;/code&gt;）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="類別成員常數類別靜態成員常數命名"&gt;類別成員常數/類別靜態成員常數命名&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;使用 ALL_CAPS （全大寫命名法）命名。 （Ex. &lt;code&gt;static const bool BATTLE_FLAG&lt;/code&gt;）。&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>