2019年3月28日

[筆記] High CPU Usage on Windows 10 Event Log (svhost.exe)

公司筆電自從某次 windows 10 更新後 CPU 使用率一直高居不下,然後風扇就一直轉吵死人,每次一開會拔掉電源就撐不了多久實在很惱人。本來開工作管理員一直看到 windows event log 想說可能是 windows 本身不知道幹了啥事就先不理他,結果過了一周完全沒改善只好去查原因,花了一個多小時才終於查到問題點 = =

2019年3月26日

[C] Variadic Macro

有時候會有個需求是像這樣:
  • 希望在執行任何 function / expression 前可以先做檢查,檢查過了才真的執行
  • 能把上述的檢查包成容易使用的形式,讓後續使用的人不會忘記
這種需求其實很常見,以 C 來說,確保一個 pointer 不是 null 後才真的拿來用是很基本的事情。所以如果可以包成像下面的形式想必會好用很多也比較不會忘記:

#define CHECK_AND_USE(x, ...) if (x) { x(...); }

typedef void (*f1ptr)(int);
typedef void (*f2ptr)(double, const char*);
f1ptr p1 = NULL;
f2ptr p2 = NULL;
CHECK_AND_USE(p1, 2) // equivalent to if (p1) { p1(2); }
CHECK_AND_USE(p2, 1.0, "test") // equivalent to if (p2) { p2(1.0, "test"); }

這樣基本上只要記得都透過 CHECK_AND_USE 就能避免用 pointer 前忘記先做 null check。重點來了:CHECK_AND_USE 中的 ... 該怎麼辦呢?顯然的,我們需要不定數量與型態的參數。而能達到這件事情的有幾個方式,這邊要介紹的是 C99 開始支援的 Variadic Macro