老汉写小工具的时候,经常有个坏毛病,那就是 Release 编译的时候不喜欢链接 CRT 库。所以经常像这样写代码:
1 2 3 4 5 6 7 8 9 |
#ifdef _DEBUG int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR pszCmdLine, int nCmdShow) #else extern "C" int APIENTRY WinMainCRTStartup() #endif { // do something here... return 0; } |
几乎从来没有出过问题,但今天栽倒了。写一个关闭显示器的小工具,总是出毛病,在 Debug 下好好的,可以关闭,到了 Release 下就会关闭后马上打开,好像是系统收到了什么事件又唤醒了似的。不过要是随意改动几行代码,保不准又偶尔能够正常工作,虽然几率非常小,而且没有任何规律。
后来没来由的就想到了 WinMainCRTStartup 上,因为我知道这个函数的返回值其实是 void 而不是 int,我之所以写成 int 是因为不想把 Debug 下的 return 0 这样的代码在 Release 下非要重写成光秃秃的 return。怀疑之后立刻动手,把上面的代码写成了如下形式:
1 2 3 4 5 6 7 8 9 10 11 12 |
#ifndef _DEBUG extern "C" void APIENTRY WinMainCRTStartup() { _tWinMain(NULL, NULL, NULL, 0); } #endif int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR pszCmdLine, int nCmdShow) { // do something here... return 0; } |
竟然就好了!而且表现很稳定。实在不知道编译器处理这个基本上没用的返回值的时候做了什么工作,有空可以再比较一下。