2018年9月16日 星期日

在 Fedora 下裝 id-utils

Fedora 似乎因為執行檔撞名,而沒有提供 id-utils 的套件,但這是使用 gj 的必要套件,只好自己編。從官網抓好 tarball,解開來編譯 (./configure && make)就是了。

但編譯後會遇到錯誤:

./stdio.h:1010:1: error: ‘gets’ undeclared here (not in a function)

這個 stdio.h 是 id-utils 產生的。id-utils 沒用到 gets,所以註解掉那行不必要的檢查即可編成功。

然後將需要用到的執行檔 gid、mkid 複製到自己的 PATH (例如 $HOME/bin),就可以用了。

2018年9月15日 星期六

makefile 雜記

備忘用到 makefile 的小技巧, 持續更新

Tip 1

$ make -n TARGET: dry run, 產生會執行的指令

Tip 2

問題: 用 make -n TARGET 產生指令 "CMD",執行 CMD 卻失敗。

解法: 可能是少了 makefile 定的環境變數,可在makefile 加上

shell:
        bash

然後用 "make shell" 透過 make 進入 bash,這樣就有一樣配置的環境變數,這時再執行 CMD 看看,若可以的話,表示問題出在少了環境變數。

2018年1月28日 星期日

C++ 能否用 memcpy 複製 class / struct 的資料?

答案是: POD (plain old data) type 可以。POD type 可和 C 互通, CPP Reference POD Type 的介紹:

Specifies that the type is POD (Plain Old Data) type. This means the type is compatible with the types used in the C programming language, can be manipulated using C library functions: it can be created with std::malloc, it can be copied with std::memmove, etc, and can be exchanged with C libraries directly, in its binary form.

C++11 開始可用 std::is_pod 判斷

在看 POD 定義的過程發現 Standard layout type 的定義也重要的:

Specifies that a type is standard layout type. Standard layout types are useful for communicating with code written in other programming languages.

符合 standard layout type 才能用 reinterpret_cast 轉型成第一個 member 的 type

不過最穩的最法是直接用 C++11 提供的 std::is_trivially_copyable 判斷, 成立的話就可以安心地用 memcpy。

如何讓 C++ STL, smart pointer 和 forward declaration

有時在 class 內訂義 member 用 std::vector 或 std::unique_ptr, 可以用 forward declaration 宣告 MyObject, 有時不行。原因在於是否有觸發 compiler inline vector / unique_ptr 的 ctor / dtor。

所以避免造成 inline ctor / dtor, 就可以用 forward declaration 宣告 MyObject, 降低程式之間不必要的 dependency, 減少重新編譯時間。

參考資料:

在 Fedora 下裝 id-utils

Fedora 似乎因為執行檔撞名,而沒有提供 id-utils 的套件 ,但這是使用 gj 的必要套件,只好自己編。從官網抓好 tarball ,解開來編譯 (./configure && make)就是了。 但編譯後會遇到錯誤: ./stdio.h:10...