mirror of
				https://github.com/RetroDECK/Duckstation.git
				synced 2025-04-10 19:15:14 +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 */
 |