digitalmars.D - Mixin bug?
- Lox (106/106) Mar 14 2005 Hi guys,
- Manfred Nowak (22/24) Mar 14 2005 [...]
Hi guys, I'm new to D but very very used to C/C++, and as any C/C++ folk i'm fighting against the lack of preprocessor's macros, recently i've discovered the use of mixins with templates which seems to enable the creation of parametrized inline code so one week ago i wrote this little test: [Code] extern(Windows) { alias uint UINT; alias void *PVOID; alias PVOID HANDLE; alias HANDLE HWND; alias HANDLE HINSTANCE; alias wchar WCHAR; alias WCHAR *LPCWSTR; alias char CHAR; alias CHAR *LPSTR; enum { MB_OK = 0x00000000, MB_OKCANCEL = 0x00000001, MB_ABORTRETRYIGNORE = 0x00000002, MB_YESNOCANCEL = 0x00000003, MB_YESNO = 0x00000004, MB_RETRYCANCEL = 0x00000005, MB_CANCELTRYCONTINUE = 0x00000006, MB_ICONHAND = 0x00000010, MB_ICONQUESTION = 0x00000020, MB_ICONEXCLAMATION = 0x00000030, MB_ICONASTERISK = 0x00000040, MB_USERICON = 0x00000080, MB_ICONWARNING = MB_ICONEXCLAMATION, MB_ICONERROR = MB_ICONHAND, MB_ICONINFORMATION = MB_ICONASTERISK, MB_ICONSTOP = MB_ICONHAND, MB_DEFBUTTON1 = 0x00000000, MB_DEFBUTTON2 = 0x00000100, MB_DEFBUTTON3 = 0x00000200, MB_DEFBUTTON4 = 0x00000300, MB_APPLMODAL = 0x00000000, MB_SYSTEMMODAL = 0x00001000, MB_TASKMODAL = 0x00002000, MB_HELP = 0x00004000, MB_NOFOCUS = 0x00008000, MB_SETFOREGROUND = 0x00010000, MB_DEFAULT_DESKTOP_ONLY = 0x00020000, MB_TOPMOST = 0x00040000, MB_RIGHT = 0x00080000, MB_RTLREADING = 0x00100000, MB_SERVICE_NOTIFICATION = 0x00200000, MB_SERVICE_NOTIFICATION = 0x00040000, MB_SERVICE_NOTIFICATION_NT3X = 0x00040000, MB_TYPEMASK = 0x0000000F, MB_ICONMASK = 0x000000F0, MB_DEFMASK = 0x00000F00, MB_MODEMASK = 0x00003000, MB_MISCMASK = 0x0000C000 } export int MessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType); } extern (C) void gc_init(); extern (C) void gc_term(); extern (C) void _minit(); extern (C) void _moduleCtor(); extern (C) void _moduleUnitTests(); template MainFunc(alias b) { extern (Windows) int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { int result; gc_init(); // initialize garbage collector _minit(); // initialize module constructor table try { _moduleCtor(); // call module constructors _moduleUnitTests(); // run unit tests (optional) result = b(hInstance, hPrevInstance, lpCmdLine, nCmdShow); } catch (Object o) // catch any uncaught exceptions { MessageBoxW(null, cast(wchar *)o.toString(), "Error", MB_OK | MB_ICONEXCLAMATION); result = 0; // failed } gc_term(); // run finalizers; terminate garbage collector return result; } } int myWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { return MessageBoxW(null, "Prova riuscita :-D", "Prova in D", MB_OK | MB_ICONEXCLAMATION); } mixin MainFunc!(myWinMain); [/Code] now the problem is that with DMD 0.114 it compiled and linked without problems, but now using DMD 0.116 the linker complains about the undefined simbol _WinMain 16 and the undefined reference _WinMain 16; I still haven't tried with the last release U(0.118), anyone can be of any help? Thnx in advance :-) "When Rome will Fall Then the World"
Mar 14 2005
Lox <Lox_member pathlink.com> wrote: [...]now the problem is that with DMD 0.114 it compiled and linked without problems[...] Not confirmed. dmd 0.114 issues the same error message. I see the problem, but I do not understand it fully. In std.c.windows.windows `HANDLE' and thereby `HINSTANCE' are `typedef'-ed to `void*'. Because this type is not introduced into your module the needed object `WinMain' cannot be found, because the `WinMain' declared in your module has the wrong signature. But importing that type from std.c.windows.windows and aliasing HANDLE to it does not solve the problem: import std.c.windows.windows; alias std.c.windows.windows.HANDLE hdl; // ... alias hdl HANDLE; // ... And it can be confirmed, that `WinMain' exists at the end of the source by introducing a further `alias' declaration: alias WinMain xxx; which compiles flawlessly and can compile only if WinMain is declared at that point. -manfred
Mar 14 2005