c語言的一處陷阱:
阿新 • • 發佈:2019-01-12
實際碰到的一個問題,從MSDN上拷貝了一段程式碼,是用C寫的,編譯通過,執行崩潰,
#include <Windows.h> // test.c 用Unicode方式編譯崩潰 void main() { STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); ZeroMemory( &pi, sizeof(pi) ); if( !CreateProcess( NULL, // No module name (use command line) "calc.exe", // Command line NULL, // Process handle not inheritable NULL, // Thread handle not inheritable FALSE, // Set handle inheritance to FALSE 0, // No creation flags NULL, // Use parent's environment block NULL, // Use parent's starting directory &si, // Pointer to STARTUPINFO structure &pi ) // Pointer to PROCESS_INFORMATION structure ) WaitForSingleObject( pi.hProcess, INFINITE ); // Close process and thread handles. CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); }
以上程式碼用unicode方式c編譯可以通過,執行時崩潰,編譯器會報個警告,兒非錯誤
test.c(13) : warning C4133: 'function' : incompatible types - from 'char [9]' to 'LPWSTR'
CreateProcessW 的第二個引數要去是LPWSTR ,這裡被強制轉換了而c++方式編譯的話會報錯,直接編譯不過
test.cpp(21) : error C2664: 'CreateProcessW' : cannot convert parameter 2 from 'const char [9]' to 'LPWSTR'