Listing GCC predefined macros, on AIX
想要知道在 AIX 上,GCC 有沒有 predefine 一些 macro,好讓我針對 PowerPC/I386、Win32/FreeBSD/Linux/AIX 等不同平台,修改程式片段,以達到 cross-platform 的需求。可是,GCC 的官方文件這麼說…
想要知道在 AIX 上,GCC 有沒有 predefine 一些 macro,好讓我針對 PowerPC/I386、Win32/FreeBSD/Linux/AIX 等不同平台,修改程式片段,以達到 cross-platform 的需求。可是,GCC 的官方文件這麼說…
沒有 peer review 的話,有些明顯的錯誤不一定會被抓出來;但即使有 peer review,某些明顯的錯誤,還是可能會不被承認。
今天在寫 code 用到 GetEnvironmentStrings(),雖然處在 UNICODE 環境下,但我希望使用 ANSI 版本,所以依照 generic-text-mapping 的慣例,直接呼叫 GetEnvironmentStringsA(),沒想到卻怎麼樣也找不到 function declaration。
最近寫程式的時候,發現不同的 compiler,其 snprintf() 的行為不太一樣。
我們有一台很強大的機器,目前正在狂抽猛送地測試我們的程式。好東西要和大家分享,所以同事和我,分別用 remote desktop 各開了一個 session 進去跑程式。然後詭異的事情發生了……
除了對 GUI 程式偵錯以外,有時候,像我這次一樣,必須對一台不能夠灌任何開發環境的電腦偵錯,這個時候,就需要用到 remote debugging。以下簡單整理一下,如何利用 Visual C++ 6 進行 remote debugging。
本系列共有三篇文章,以及一篇補充資料,建議依照以下順序閱讀:
Race condition in C wrapper of mutex class (補充資料)
Implementing dprintf() with __VA_ARGS__
Implementing dprintf() without __VA_ARGS__
Implementing DFORMAT and DOUT (尚未完成)
在這篇《Implementing dprintf() with __VA_ARGS__》裡,簡介了如何利用 __VA_ARGS__ 做出好用的 dprintf(),以協助我們僅在測試版裡傾印偵錯訊息。然而,某些老舊但仍然十分活躍的 compilers,如 VC6,並沒有支援 __VA_ARGS__。因為通常來說,為了照顧既有的大量程式,以及一些政治問題,更換 compiler 有時是不可能的。所以我們最好還是來想想,怎樣在不支援 __VA_ARGS__ 的情況下,仍然將 dprintf() 實作出來。
仔細檢視 dprintf_v2() 與 dprintf_v3() 在 #define 時的差別,我們會發現,dprintf_v2() 其實並不是一個真正的 function-like macro,而僅僅只是把 dprintf_v2 這個「名字」給代換成 dprintf_v2_impl。於是,原本跟在後面,屬於 dprintf_v2 的參數,經過 preprocessor 處理之後,變成了跟在 dprintf_v2_impl 的後面。這樣的作法,除了之前提過的,在釋出版裡,剩下來的參數列,不一定有辦法被最佳化去掉之外,還有一個更大的問題就是,沒有辦法於呼叫 dprintf_v2() 時省略 __FILE__ [...]
(這是一篇積存的舊文,原始發想時間大約在 2007 年,但精確的日子已不可考。)
這是怎樣,平均每個月可以遇到一個 VC6 的問題,真苦。XD
這次的問題出在 strftime() 這個標準 C 的函式。依據 C99,若傳進 strftime() 的 format specifier 有 %Z 或 %z 的話,分別應該被代換為:
%Z is replaced by the locale’s time zone name or abbreviation, or by no characters if no time zone is determinable. [tm_isdst]
%z is replaced by the offset from UTC in the ISO8601 format ‘‘-0430’’ (meaning 4 hours [...]
Microsoft Visual C++ 6 (VC6) 是個歷史悠久的 compiler,自 1998 年推出之後,一直到了 2002 年,才有 Visual Studio .NET 2002 這個後繼版本推出。在這期間,Microsoft 一共推出了 6 個 service packs,以解決各種 VC6 的 bug。但在實務上,我們並沒有一個很方便的方法,可以得知目前灌在系統裡的 VC6,其 service pack 的版本為何:
從 VC6 選單的 Help > About Visual C++,我們只會看到簡單的「Visual C++R 6.0」的版本號。
從控制台的「變更或移除程式」,我們也只能看到「Microsoft Visual Studio 6.0 xxx Edition」的字樣。
能否弄清楚 patch 到那一版的 service pack,有時候非常重要。不同的 service pack 版本,小則編譯出來的程式執行效率不同,大則執行結果不同,這些差異,無法忽視。
根據 MSDN 的這篇《How To Tell That a [...]