C++14 與 C++17 Lambda Expression 的改變

在很久以前,Heresy 就曾經曾對 C++11(當時還叫做 C++0x)的新語法、Lambda Experssion 寫過簡單的介紹、《C++0x:Lambda expression》了~

由於 lambda 這種匿名函式再搭配需要使用 function object 的時候,會是一個相當方便的東西,所以 Heresy 也常常在使用。

而在 C++11 引進後,其實在後面的 C++14C++17 中,也都有針對 lambda 再做一些改進;雖然之前其實也有簡單提過,不過這邊就在整理一下,這兩次改版中,Heresy 個人覺得比較用的到的變化吧~

閱讀更多»

廣告

在 VisualStudio IDE 使用 64 位元 C++ 原生編譯環境

VisualStudio 目前在 C++ 的部分,可以針對程式,建置出 32 位元(x86)和 64 位元(x64)的程式。

不過實際上,微軟有提供 32 位元以及 64 位元的建置工具、兩者都可以建置出 x86 以及 x64 的程式。也就是說,使用 32 位元的建置工具不但可以建置出 x86 的程式,也可以建置出 x64 的程式;同樣的,64 位元的建置工具,也可以建置出 x86 / x64 的程式。

而微軟目前基本上針對 VisualStudio 的 IDE 圖形介面,基本上都還是僅有 32 位元的版本、並沒有 64 位元的版本。
另外,微軟在透過 IDE 來建置的時候,就算是要建置 x64 的程式,預設也都是會去使用 32 位元的建置工具、來建置 x64 的程式(x86_x64 Cross Tools)。

閱讀更多»

使用 enum class 取代傳統的 enum

「Scoped and strongly typed enums」是 C++11 時所引進的一個新的功能,主要是要取代舊的列舉型別(enum)。

他的基本用法,是在 enum 後面,再加上 classstruct;而要使用定義的值的時候,一定要加上範圍(scope、這邊就是 class 的名稱)。

下面就是簡單的比較:

enum
enum class
enum EColor
{
	RED,
	GREEN,
	BLUE
};
 
EColor eColor = RED;
enum class EColor
{
	RED,
	GREEN,
	BLUE
};
 
EColor eColor = EColor::RED;

閱讀更多»

在程式離開範圍時,自動執行動作:GSL finally

之前已經大概介紹過 C++ Guidelines Support Library 這個簡單的函式庫了;當時,也有簡單地介紹一下裡面的 owner<T>

而這一篇,則是來講一下一個 Heresy 個人覺得還滿實用的東西:finally

當在寫程式的時候,常常會在某個地方,需要建立很多臨時性的資源、來做計算、儲存,而當結果計算出來後,這些東西就需要被釋放掉。

如果程式的路線很簡單,只有一條線的話,其實很好處理、不太會成為問題;但是如果是一個函式,可能會有好幾條路線、甚至會提早 return、結束函式的話,要怎麼比較好地去把這些臨時性的資源清理掉,就會是個問題了。

閱讀更多»

C++ Guidelines Support Library

Heresy 在 2015 曾經簡單介紹過《C++ Core Guidelines》(官方)了。而實際上,他的整份文件很多條目,老實說要全部看過(理解)要相當的時間,也有相當的難度,所以 Heresy 後來其實也沒很認真去碰。

如果對內容有興趣的話,可以參考「Modernes C++」這個網站(連結),他有針對 C++ Core Guidelines 撰寫了大量的文章(分類),應該算是可以輔助閱讀的資料。

閱讀更多»

解決 g++ 連結程式時的循環相依性的問題

在寫 C++ 的程式的時候,如果有拆分模組,有的時候會導致不同模組/函式庫之間的相依性變得很複雜、甚至可能會產生彼此互相相依的狀況(circular dependencies、維基百科有提供例子)。

在 Visual C++ 的環境下,linking 階段似乎是沒有順序、而且不會因為連結的順序、導致找不到參考的狀況。

但是在 g++ 的環境下,由於他的連結是有順序性的,所以如果加上 -lXXX 的順序不對,就可能會出現找不到參考的問題(錯誤訊息是「undefined reference」)。
比如說如果 libA 有用到 libB 的函式的話,那在連結的時候,libA 就必須要在 libB 的前面。

閱讀更多»

檢查網頁的表單資料的方法紀錄

這篇算是自己在幫不是自己寫的網站找 Bug 的時候,找的一些方法的紀錄。

基本上,主要是從前一陣子開始有在用某些政府單位的網站系統,結果被告知送出的表單內容出了一堆錯誤,結果搞到自己火大,只好自己開始找錯誤是怎麼發生的了。

由於網頁不是自己寫的,後台也沒有權限看,也沒有系統可以查詢,所以只好靠瀏覽器來找看看表單送出的狀況了。

由於操作系統時是使用 Google Chrome,所以接下來要找問題,當然也就是使用 Chrome 了;而基本上的操作,都是按下 F12 叫出 DevTools 後再開始的~

閱讀更多»

C++17 新的數字、字串轉換函式庫:std::from_chars

在 C++ 裡面,其實已經有不少在字串與數字間轉換的方法了,像是 sprintf、sscanf、atol、strtol、stringstream、to_string 等等…

而在 Boost C++ Libraries 裡面,為了各種原因,也有另外提供 lexical_castConvert 等函式庫,讓使用者可以更方便地進行文字和數字間的轉換。

C++17 裡面,又有另一個標準的選擇了!那就是 std::from_chars()參考)。

為什麼在已經有這麼多方法的情況下,還要再多弄一個出來呢?基本上,std::from_chars() 是一個相對低接、可以提供最好的效能的函式;或許使用上沒那麼便利,但是適用於非常在乎效能的時候。

閱讀更多»

使用 Visual Studio 編輯、預覽 Markdown 說明:Markdown Editor

「Markdown」這種標記語言(維基百科、常見附檔名是 .md),是一種輕量化的標記語言,可以用相對簡單的語法,來做出簡易的格式化文件。雖然他的語法有限,能呈現出的多樣性比不上 HTML + CSS 等複雜的語法,但是基本上對於要寫一般文件,也算夠用了。

而 Markdown 開始成為主流,在 Heresy 個人覺得,似乎還是因為 GitHub(官網)就是基於 MArkdown 的 GFM(GitHub Flavored Markdown、官方規格)來做預設的文件格式。

所以,如果要在這類的程式碼控管平台上撰寫說明文件的話,勢必得需要了解基本的 Markdown 語法。

閱讀更多»