C和D中的相同_exact_代码给出不同的结果 – 为什么?
发布时间:2020-12-16 10:22:11 所属栏目:百科 来源:网络整理
导读:当我运行这个C代码时: // Get rid of the CRT and stuff; we don't need it#pragma comment(linker,"/Entry:mainCRTStartup")#pragma comment(linker,"/NoDefaultLib:msvcrt.lib")#pragma comment(linker,"/NoDefaultLib:kernel32.lib")#pragma comment(lin
当我运行这个C代码时:
// Get rid of the CRT and stuff; we don't need it #pragma comment(linker,"/Entry:mainCRTStartup") #pragma comment(linker,"/NoDefaultLib:msvcrt.lib") #pragma comment(linker,"/NoDefaultLib:kernel32.lib") #pragma comment(linker,"/NoDefaultLib:ntdll.lib") #pragma comment(linker,"/Subsystem:Console") #pragma comment(lib,"user32.lib") #include <windows.h> int mainCRTStartup() { MSG msg; HWND hWndParent; WNDCLASS wndClass = { 0,&DefWindowProc,NULL,LoadCursor(NULL,IDC_ARROW),GetSysColorBrush(COLOR_3DFACE),TEXT("MyClass") }; RegisterClass(&wndClass); hWndParent = CreateWindow( wndClass.lpszClassName,WS_VISIBLE | WS_OVERLAPPEDWINDOW,33,100,NULL); CreateWindow(TEXT("Button"),wndClass.lpszClassName,WS_VISIBLE | WS_CHILD | BS_GROUPBOX,5,50,hWndParent,NULL); while (GetMessage(&msg,0) > 0) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } 我明白了: 但是当我运行等效的D代码时: // Again,get rid of the runtime pragma(startaddress,mainCRTStartup); pragma(lib,"dmd_win32.lib"); import win32.windows; int mainCRTStartup() { MSG msg; HWND hWndParent; WNDCLASS wndClass = { 0,"MyClass" }; RegisterClass(&wndClass); hWndParent = CreateWindow( wndClass.lpszClassName,NULL); CreateWindow("Button",0) > 0) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } 我明白了: 我很困惑……有什么可能导致这个白色背景?! 编辑: 我不确定它实际上是一个库bug …我只是删除了依赖项(我没有看到代码有什么问题),但问题仍然存在: version = Unicode; extern(Windows): alias void* HWND,HMENU,HINSTANCE,HCURSOR,HBRUSH,HICON; alias ushort ATOM,WORD; alias uint UINT,DWORD; alias int[2] POINT; alias int BOOL; alias int LONG; alias size_t WPARAM,LPARAM,LRESULT; alias char* LPSTR; alias const(char)* LPCSTR; alias wchar* LPWSTR; alias const(wchar)* LPCWSTR; version(Unicode) { alias LPCWSTR LPCTSTR; alias LPWSTR LPTSTR; alias GetMessageW GetMessage; alias CreateWindowExW CreateWindowEx; alias DispatchMessageW DispatchMessage; alias DefWindowProcW DefWindowProc; alias LoadCursorW LoadCursor; alias RegisterClassW RegisterClass; alias WNDCLASSW WNDCLASS; } else { alias LPCSTR LPCTSTR; alias LPSTR LPTSTR; alias GetMessageA GetMessage; alias CreateWindowExA CreateWindowEx; alias DispatchMessageA DispatchMessage; alias DefWindowProcA DefWindowProc; alias LoadCursorA LoadCursor; alias RegisterClassA RegisterClass; alias WNDCLASSA WNDCLASS; } LPCTSTR MAKEINTATOM(ATOM atom) { return cast(LPCTSTR)atom; } ATOM RegisterClassA(WNDCLASSA*); ATOM RegisterClassW(WNDCLASSW*); HCURSOR LoadCursorA(HINSTANCE,LPCSTR); HCURSOR LoadCursorW(HINSTANCE,LPCWSTR); LRESULT DefWindowProcA(HWND,UINT,WPARAM,LPARAM); LRESULT DefWindowProcW(HWND,LPARAM); BOOL GetMessageA(const(MSG)*,HWND,UINT); BOOL GetMessageW(const(MSG)*,UINT); LONG DispatchMessageA(const(MSG)*); LONG DispatchMessageW(const(MSG)*); BOOL TranslateMessage(const(MSG)*); HWND CreateWindowExA(int,LPCSTR,DWORD,int,void*); HWND CreateWindowExW(int,LPCWSTR,void*); HBRUSH GetSysColorBrush(int); alias LRESULT function(HWND,LPARAM) WNDPROC; enum { NULL = null,COLOR_3DFACE = 15,BS_GROUPBOX = 7,} const LPCTSTR IDC_ARROW = cast(LPCTSTR)32512; struct MSG { HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; } struct WNDCLASSA { UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCSTR lpszMenuName; LPCSTR lpszClassName; } struct WNDCLASSW { UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCWSTR lpszMenuName; LPCWSTR lpszClassName; } enum { WS_OVERLAPPED = 0,WS_TILED = WS_OVERLAPPED,WS_MAXIMIZEBOX = 0x00010000,WS_MINIMIZEBOX = 0x00020000,WS_TABSTOP = 0x00010000,WS_GROUP = 0x00020000,WS_THICKFRAME = 0x00040000,WS_SIZEBOX = WS_THICKFRAME,WS_SYSMENU = 0x00080000,WS_HSCROLL = 0x00100000,WS_VSCROLL = 0x00200000,WS_DLGFRAME = 0x00400000,WS_BORDER = 0x00800000,WS_CAPTION = 0x00c00000,WS_OVERLAPPEDWINDOW = WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX,WS_TILEDWINDOW = WS_OVERLAPPEDWINDOW,WS_MAXIMIZE = 0x01000000,WS_CLIPCHILDREN = 0x02000000,WS_CLIPSIBLINGS = 0x04000000,WS_DISABLED = 0x08000000,WS_VISIBLE = 0x10000000,WS_MINIMIZE = 0x20000000,WS_ICONIC = WS_MINIMIZE,WS_CHILD = 0x40000000,WS_CHILDWINDOW = 0x40000000,WS_POPUP = 0x80000000,WS_POPUPWINDOW = WS_POPUP|WS_BORDER|WS_SYSMENU,} pragma(startaddress,mainCRTStartup); int mainCRTStartup() { MSG msg; HWND hWndParent; WNDCLASS wndClass = { 0,"MyClass" }; ATOM atom = RegisterClass(&wndClass); hWndParent = CreateWindowEx( 0,NULL); CreateWindowEx(0,"Button",0) > 0) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } 要么我做错了,要么是编译器错误……但即使它是编译器错误,我仍然不知道这样的事情会发生什么,因为它需要调用非常具体的API!想法? 解决方法
这是子系统版本问题(链接器责任).添加-L / SUBSYSTEM:CONSOLE:4.0到dmd命令行来修复MyClass背景颜色. Walter喜欢旧系统,因此默认的OPTLINK子系统版本为3.10.看起来像Microsoft的链接9.0使用5.0作为默认子系统版本.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |