C++11/14 literals:part 2

針對 C++11C++14 的 literals,前面已經寫了 part 1 來針對標準提供的 literals 做了一些說明;而接下來這篇,則是來紀錄一下如何自訂屬於自己的 literals、也就是所謂「User-defined literals」(CppReference)。

在定義 User-defined literals 的時候,能支援的格式是有限制的,包括了:

  • 整數:(unsigned long long int)
  • 浮點數:(long double)
  • 字元:(char)(wchar_t)(char16_t)(char32_t)
  • 字串:(char,size_t)(wchar_t,size_t)(char16_t,size_t)(char32_t,size_t)

如果不是這些型別的話,是不能編譯的。

閱讀更多»

廣告

Boost ASIO WebSocket Server 網站憑證設定

Heresy 這邊很早之前,就有開始使用 WebSocket++ 來開發自己的 WebSocket Server;而後來其實也有改用 Boost.Beast 來做同樣的工作。而這兩套函式庫的底層,其實都是 Boost::asio(官網),所以其實在某些地方還滿接近的。

而之前用起來都還算很正常,不管是老老的 IE 還是 Chrome 都可以使用,在有申請 SSL 憑證的情況下,就算建立加密的 WSS 也是可以正確使用的。

但是,前陣子當想使用 node.js(官網)來進行 WebSocket 的連線的時候,卻發現會出現「unable to verify the first certificate」的錯誤。

閱讀更多»

GitLab 的 C++ CI/CD 腳本:使用 PowerShell

之前已經在《GitLab 簡單的 C++ 專案腳本範例》這篇文章裡面,大概整理了一下 Heresy 這邊針對自己的 C++ 專案、撰寫出來的 GitLab CI 自動建置的腳本了。

不過,當時在 Windows 平台下,Heresy 是使用「Windows Batch」(CMD)這個 shell 來進行操作的。

但是,GitLab 官方其實有說,從 11.11 開始,就將「Windows Batch executor」設定為棄用(deprecated),並將於 13.0 時移除(預計時間是 2020/06/22);而取而代之的,GitLab 將使用 PowerShell 來作為 Windows 上預設的 shell。(參考

而這篇記錄,就是簡單地記錄一下 Heresy 把之前 cmd 的 script、改寫成 PowerShell 版本的紀錄。

閱讀更多»

C++11/14 literals:part 1

這篇基本上是 C++11C++14 針對「literal」(不確定該怎麼翻譯,Cpp Reference 翻譯成「字面量」、MSDN 則是翻譯成「常值 」)的一些新特性做介紹。

所謂的 literal 在 Heresy 來看,主要的功能就是在透過透過數字、或是字串來建立新的變數時,強制指定型別的一種方式。

之前的 C++ 標準中就已經存在了,下面就是一些例子:

auto fVal = 1.0f;     // float
auto dVal = 1.0;      // double
auto sVal = "test";   // const char*
auto wVal = L"test";  // const wchar_t*

閱讀更多»

GitLab 簡單的 C++ 專案腳本範例

之前寫過《Gitlab CI/CD 簡單介紹》,大概介紹過 GitLab CI/CD 的架構了,而 Heresy 這邊,其實也針對工作用的 C++ 專案,撰寫了對應的腳本了。

雖然實際上還是有點問題,不過目前看來運作得好像也還算正常,就來稍微分享一下吧~

首先,在系統的配置上,Heresy 這邊是準備了兩台 VM 作為 GitLab Runner,一台是 Windows 10、一台是 Ubuntu,分別處理 Windows 和 Linux 的環境。

而在腳本上,則是分成了分析、建置、測試三個階段:

閱讀更多»

enum class 的 bitwise operation

這篇算是之前《使用 enum class 取代傳統的 enum》的後續。

當時介紹的 enum class 基本上是 C++11 引入、強化列舉型別的型別強度的設計;透過這樣的設計,可以避免一些程式設計上可能會碰到的問題。

但是,當 Heresy 後來實際要使用的時候,才發現 enum class 在某些方面上,似乎還有一些地方沒辦法和 enum 一樣地使用。

其中一個比較大的困擾,就是 enum class 沒有預設提供 bitwise operation,所以沒辦法直接把 enum class 當成 bitmask 來用。

閱讀更多»

C++11 的錯誤碼標準 part 3:補充與實作

針對 C++11 提供的 <system_error> 這個函式庫,Heresy 之前已經在 part 1 寫了 error_code 的基本使用,也在 part 2 寫了 error_condition 的東西。而在 part 2 的時候也有提到,由於 Heresy 在寫 part 1 的時候,其實對於 std::error_codestd::error_condtion 的關係有點誤解,導致有一些東西沒講到,所以這邊就先回到 std::error_code 的部分,做一些補充。

首先,之前在實作 error_code 的時候,總共實作了:

  • enum class ErrorCode
  • class ErrorCategory
    • message()
    • name()
  • make_error_code()
  • is_error_code_enum<Heresy::ErrorCode>

閱讀更多»

C++11 的錯誤碼標準 part 2:error_condition

這篇是延續之前的《C++11 的錯誤碼標準:error_code》一文,繼續來講 <system_error> 裡的另一個類別、std::error_condition文件)。

不過老實說,Heresy 在繼續寫這篇的時候,才發現之前對於這邊的設計有些誤解,所以其實在 error_code 這篇文章有的內容可能不夠完整,預計會在用第三篇文章繼續補齊。

error_conditionerror_code 非常地接近,不管是實際儲存的資料,或是介面的設計,基本上都沒有太大的差異;兩者的差別,主要是概念上、使用時機的差別。

兩者的差異,主要是:

  • error_code 基本上是比較底層的錯誤碼,針對有可能會因為作業系統實作的不同
  • error_condition 則是和平台差異無關(platform-independent)的錯誤碼,主要是用來做比較用的

閱讀更多»

C++11 的錯誤碼標準 part 1:error_code

<system_error> 這個函式庫是 C++11 時,加入標準函式庫裡的一個功能(C++ Referencecplusplus),主要是為了在 exception 以外,提供一個更有架構、同時也有擴展能力的錯誤回報機制。

為什麼不都用 exception 呢?主要是因為並不是所有的錯誤都是例外。
像是以網路的程式來說,有一些錯誤狀況,會是有相當高的發生機會、本來就應該要在程式的流程中被考慮到的、而不應該用例外來處理。

所以在這種狀況下,使用 exception 來處理這些錯誤狀況,並不見得是個好的方法。

<system_error> 最初是 Boost C++ Libraries 中的東西(參考),後來才被整合到 C++11 裡的,所以如果有在用 Boost 的話,對他應該不至於太陌生;像是在 Boost::ASIO(參考)裡面,主要就是透過 error_code 來做錯誤的回報。

閱讀更多»

VisualStudio 的視覺化偵錯工具:Graphical Debugging

「Graphical Debugging」(網頁)是 VisualStudio 的一個延伸模組,它的功能是可以把 C++ 與 C# 中特並類型的資料、視覺畫出來、方便在偵錯的時候觀察。官方的說明是:

Visualization of C++ and C# variables during debugging, e.g. Boost.Geometry models, containers of values, arrays of points, etc.

Heresy 最早看到是很久以前的「Boost Debugger visualizers」(網頁),最初應該是只有針對 Boost C++ Libraries 的型別來做監看的修飾,但是看來現在功能多了很多了~

閱讀更多»