mirror of
https://github.com/RetroDECK/Duckstation.git
synced 2024-11-22 22:05:38 +00:00
101 lines
3 KiB
C
101 lines
3 KiB
C
|
#ifndef RC_EXPORT_H
|
||
|
#define RC_EXPORT_H
|
||
|
|
||
|
/* These macros control how callbacks and public functions are defined */
|
||
|
|
||
|
/* RC_SHARED should be defined when building rcheevos as a shared library (e.g. dll/dylib/so). External code should not define this macro. */
|
||
|
/* RC_STATIC should be defined when building rcheevos as a static library. External code should also define this macro. */
|
||
|
/* RC_IMPORT should be defined for external code using rcheevos as a shared library. */
|
||
|
|
||
|
/* For compatibility, if none of these three macros are defined, then the build is assumed to be RC_STATIC */
|
||
|
|
||
|
#if !defined(RC_SHARED) && !defined(RC_STATIC) && !defined(RC_IMPORT)
|
||
|
#define RC_STATIC
|
||
|
#endif
|
||
|
|
||
|
#if (defined(RC_SHARED) && defined(RC_STATIC)) || (defined(RC_SHARED) && defined(RC_IMPORT)) || (defined(RC_STATIC) && defined(RC_IMPORT))
|
||
|
#error RC_SHARED, RC_STATIC, and RC_IMPORT are mutually exclusive
|
||
|
#endif
|
||
|
|
||
|
/* RC_BEGIN_C_DECLS and RC_END_C_DECLS should be used for all headers, to enforce C linkage and the C calling convention */
|
||
|
/* RC_BEGIN_C_DECLS should be placed after #include's and before header declarations */
|
||
|
/* RC_END_C_DECLS should be placed after header declarations */
|
||
|
|
||
|
/* example usage
|
||
|
*
|
||
|
* #ifndef RC_HEADER_H
|
||
|
* #define RC_HEADER_H
|
||
|
*
|
||
|
* #include <stdint.h>
|
||
|
*
|
||
|
* RC_BEGIN_C_DECLS
|
||
|
*
|
||
|
* uint8_t rc_function(void);
|
||
|
*
|
||
|
* RC_END_C_DECLS
|
||
|
*
|
||
|
* #endif
|
||
|
*/
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
#define RC_BEGIN_C_DECLS extern "C" {
|
||
|
#define RC_END_C_DECLS }
|
||
|
#else
|
||
|
#define RC_BEGIN_C_DECLS
|
||
|
#define RC_END_C_DECLS
|
||
|
#endif
|
||
|
|
||
|
/* RC_CCONV should be used for public functions and callbacks, to enforce the cdecl calling convention, if applicable */
|
||
|
/* RC_CCONV should be placed after the return type, and between the ( and * for callbacks */
|
||
|
|
||
|
/* example usage */
|
||
|
/* void RC_CCONV rc_function(void) */
|
||
|
/* void (RC_CCONV *rc_callback)(void) */
|
||
|
|
||
|
#if defined(_WIN32)
|
||
|
/* Windows compilers will ignore __cdecl when not applicable */
|
||
|
#define RC_CCONV __cdecl
|
||
|
#elif defined(__GNUC__) && defined(__i386__)
|
||
|
/* GNU C compilers will warn if cdecl is defined on an unsupported platform */
|
||
|
#define RC_CCONV __attribute__((cdecl))
|
||
|
#else
|
||
|
#define RC_CCONV
|
||
|
#endif
|
||
|
|
||
|
/* RC_EXPORT should be used for public functions */
|
||
|
/* RC_EXPORT will provide necessary hints for shared library usage, if applicable */
|
||
|
/* RC_EXPORT should be placed before the return type */
|
||
|
|
||
|
/* example usage */
|
||
|
/* RC_EXPORT void rc_function(void) */
|
||
|
|
||
|
#ifdef RC_SHARED
|
||
|
#if defined(_WIN32)
|
||
|
#define RC_EXPORT __declspec(dllexport)
|
||
|
#elif defined(__GNUC__) && __GNUC__ >= 4
|
||
|
#define RC_EXPORT __attribute__((visibility("default")))
|
||
|
#else
|
||
|
#define RC_EXPORT
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
#ifdef RC_IMPORT
|
||
|
#if defined(_WIN32)
|
||
|
#define RC_EXPORT __declspec(dllimport)
|
||
|
#elif defined(__GNUC__) && __GNUC__ >= 4
|
||
|
#define RC_EXPORT __attribute__((visibility("default")))
|
||
|
#else
|
||
|
#define RC_EXPORT
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
#ifdef RC_STATIC
|
||
|
#if defined(__GNUC__) && __GNUC__ >= 4
|
||
|
#define RC_EXPORT __attribute__((visibility("default")))
|
||
|
#else
|
||
|
#define RC_EXPORT
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
#endif /* RC_EXPORT_H */
|