/* Include Guard */ #ifndef SHARED_KERNELS_H #define SHARED_KERNELS_H /** * Includes */ #include /** * Defines */ /** * When building a library, it is a good idea to expose as few as possible * internal symbols (functions, objects, data structures). Not only does it * prevent users from relying on private portions of the library that are * subject to change without any notice, but it can have performance * advantages: * * - It can make shared libraries link faster at dynamic-load time. * - It can make internal function calls faster by bypassing the PLT. * * Thus, the compilation should by default hide all symbols, while the API * headers will explicitly mark public the few symbols the users are permitted * to use with a PUBLIC tag. We also define a HIDDEN tag, since it may be * required to explicitly tag certain C++ types as visible in order for * exceptions to function correctly. * * Additional complexity comes from non-POSIX-compliant systems, which * artificially impose a requirement on knowing whether we are building or * using a DLL. * * The above commentary and below code is inspired from * 'https://gcc.gnu.org/wiki/Visibility' */ #if defined(_WIN32) || defined(__CYGWIN__) # define TAG_ATTRIBUTE_EXPORT __declspec(dllexport) # define TAG_ATTRIBUTE_IMPORT __declspec(dllimport) # define TAG_ATTRIBUTE_HIDDEN #elif __GNUC__ >= 4 # define TAG_ATTRIBUTE_EXPORT __attribute__((visibility("default"))) # define TAG_ATTRIBUTE_IMPORT __attribute__((visibility("default"))) # define TAG_ATTRIBUTE_HIDDEN __attribute__((visibility("hidden"))) #else # define TAG_ATTRIBUTE_EXPORT # define TAG_ATTRIBUTE_IMPORT # define TAG_ATTRIBUTE_HIDDEN #endif #if TAG_IS_SHARED # if TAG_IS_BUILDING # define TAG_PUBLIC TAG_ATTRIBUTE_EXPORT # else # define TAG_PUBLIC TAG_ATTRIBUTE_IMPORT # endif # define TAG_HIDDEN TAG_ATTRIBUTE_HIDDEN #else # define TAG_PUBLIC # define TAG_HIDDEN #endif #define TAG_STATIC static /* Extern "C" Guard */ #ifdef __cplusplus extern "C" { #endif /* Function Prototypes */ TAG_PUBLIC int run_tests(void); /* End Extern "C" and Include Guard */ #ifdef __cplusplus } #endif #endif