星期六, 2月 11, 2017

義大利麵代碼怪,AHK 0.208


為了增加實力,決定研究常用 opensource 專案的原始碼,目標是自己常用的 autohotkey,從遠古的 0.208 版入手。

根據 solution file,這版本是 VC++ 7.1 時代的原始產物。花了點時間,解決了所有的 compile & link error 總算在 VS2015 編譯通過,開始研究原始碼之旅。

 
目前心得:

1. 為什麼這東西 VC++ 7.1 版允許編譯?

我修掉的 bug 類似:
 
a.cpp:
    static SomeClass foo;

b.cpp:
    foo = .....

b.cpp 沒有 extern declaration,就直接使用了另外一個 compilation unit 的 global static variable。我沒裝 VC++ 7.1 實際去編,不過假設放在 public Git repo 都能編的話,那 VC++ 7.1 允許這種東西 compile & link 也挺神奇的 orz



2. 神奇的巨集海

 ...
# define ARG1 (mArgc > 0 ? sArgDeref[0] : "")
...
# define FOUR_ARGS ARG1, ARG2, ARG3, ARG4
...
if (WinActivate(FOUR_ARGS, mActionType == ACT_WINACTIVATEBOTTOM))
...



這甚麼優(ㄜˇ)雅(ㄒㄧㄣ)的寫法。結果一個 class 的 definition 都看不完就累了,看完 28000+ 行原始碼可能要花時間 orz


結論:我和義大利麵代碼怪特別有緣,就連挑 opensource 專案能都遇到義大利麵代碼怪,還有我以前的寫法並不糟 XDDDDDDDDD
全文連結