[OT] #define

Mike Parker via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon May 22 09:56:10 PDT 2017


On Monday, 22 May 2017 at 16:37:51 UTC, Andrew Edwards wrote:

> Specific context at the following links:

>
> https://github.com/glfw/glfw/blob/66ff4aae89572419bb130c5613798e34d7521fc7/deps/glad/glad.h#L24-L48

APIENTRY is typically defined in Windows headers to set the 
stdcall calling convention (which is where we get extern(Windows) 
in D) in function declarations. You'll find it all over Win32 API 
headers. In this case, since OpenGL uses it on Windows, glad is 
checking if it's defined and, if not, defining it as empty for 
non-Windows platforms. That way it can be used in the function 
signatures glad generates on every platform.

Generally, any functions in the Windows-specific sections with 
APIENTRY in their declarations need to be declared in D as 
extern(Windows). APIENTRY itself can be left out of the D binding.


> https://github.com/glfw/glfw/blob/66ff4aae89572419bb130c5613798e34d7521fc7/deps/glad/glad.h#L57-L81
>

Again, GLAPI is a Windows-specific thing. A lot of libraries that 
support compiling to a DLL define something similar on Windows. 
Function declarations need to be exported when compiling a DLL 
and imported when compiling programs that use the DLL, so the 
FOOAPI technique is used to apply the correct attribute to each 
declaration. On other platforms, FOOAPI is defined as empty.

You can safely ignore this one, unless you're planning to do a 
pure D port (not binding) of the library and intend to compile as 
a shared lib. It tells you which functions need to be exported 
from the shared lib to match the C API.

> https://github.com/glfw/glfw/blob/66ff4aae89572419bb130c5613798e34d7521fc7/deps/glad/glad.h#L88-L124

This one is a guard that makes sure that everything in the 
#ifndef GLEXT_64_TYPES_DEFINED block is only imported once. It's 
explained in the comment:

/* This code block is duplicated in glxext.h, so must be 
protected */

By defining GLEXT_64_TYPES_DEFINED, if glxext.h after, then it 
presumably also has a #ifndef GLEXT_64_TYPES_DEFINED block and 
will not redefine those types.

This one can also be ignored on the D side.




More information about the Digitalmars-d-learn mailing list