C和D中的相同_exact_代码给出不同的结果 – 为什么?

C和D中的相同_exact_代码给出不同的结果 – 为什么?,第1张

概述当我运行这个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, "/NoDefaultLi 当我运行这个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 runtimepragma(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作为默认子系统版本. 总结

以上是内存溢出为你收集整理的C和D中的相同_exact_代码给出不同的结果 – 为什么?全部内容,希望文章能够帮你解决C和D中的相同_exact_代码给出不同的结果 – 为什么?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1219653.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存