On Monday, 22 May 2017 at 18:44:10 UTC, Andrew Edwards wrote:
There isn't any Windows specific section. Every function
pointer in the library is decorated in one of the following two
forms
void (APIENTRY *NAME)(PARAMS)
or
void (APIENTRYP NAME)(PARAMS)
Sorry, I worded that poorly. APIENTRY is defined somewhere in the
Win32 headers. IIRC, it's an alias for WINAPI, which is also
defined in the Win32 headers to declare the standard call calling
convention (which is __stdcall on the MS compiler and something
else, I think, on GCC). OpenGL includes windows.h on Windows, so
the Win32-specific stuff is there. The functions aren't in any
Win32-specific sections.
Both happen to be the exact same. So does mean that for every
function pointer in the file, I need to duplicate as such?
version (Windows)
{
extern(Windows)
{
alias NAME = void function(PARAMS);
}
}
else
{
extern(C)
{
alias NAME = void function(PARAMS);
}
}
Adam's answer about extern(System) is the solution. Before it was
added, this code is exactly what I had to use in Derelict.
So if I'm understanding correctly, on Windows platforms this:
typedef void (APIENTRYP PFNGLDISABLEPROC)(GLenum cap);
GLAPI PFNGLDISABLEPROC glad_glDisable;
#define glDisable glad_glDisable
is technically:
typedef void (__syscall* PFNGLDISABLEPROC)(GLenum cap);
extern "C" PFNGLDISABLEPROC glad_glDisable;
#define glDisable glad_glDisable
__stdcall, not __syscall
which in D is:
// extern (Windows) obviated by the fact that the following
line exports to the C API?
extern (C) alias glad_glDisable = void function(GLenum cap);
glad_glDisable glDisable;
extern(System) for anything cross-platform. If it's something
you're using only on Windows, then you can use extern(Windows).