21 #ifndef _freetds_macros_h_ 22 #define _freetds_macros_h_ 24 #ifndef _freetds_config_h_ 25 #error should include config.h before 32 #define TDS_ZERO_FREE(x) do {free((x)); (x) = NULL;} while(0) 33 #define TDS_VECTOR_SIZE(x) (sizeof(x)/sizeof(x[0])) 36 #define TDS_OFFSET(type, field) offsetof(type, field) 38 #define TDS_OFFSET(type, field) (((char*)&((type*)0)->field)-((char*)0)) 41 #if ENABLE_EXTRA_CHECKS 42 # if defined(__llvm__) || (defined(__GNUC__) && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))) 43 # define TDS_COMPILE_CHECK(name,check) \ 44 _Static_assert(check,#name) 45 # elif defined(__GNUC__) && __GNUC__ >= 2 46 # define TDS_COMPILE_CHECK(name,check) \ 47 extern int name[(check)?1:-1] __attribute__ ((unused)) 49 # define TDS_COMPILE_CHECK(name,check) \ 50 extern int name[(check)?1:-1] 52 # define TDS_EXTRA_CHECK(stmt) stmt 54 # define TDS_COMPILE_CHECK(name,check) \ 55 extern int disabled_check_##name 56 # define TDS_EXTRA_CHECK(stmt) 59 #if defined(__GNUC__) && __GNUC__ >= 3 60 # define TDS_LIKELY(x) __builtin_expect(!!(x), 1) 61 # define TDS_UNLIKELY(x) __builtin_expect(!!(x), 0) 63 # define TDS_LIKELY(x) (x) 64 # define TDS_UNLIKELY(x) (x) 67 #if ENABLE_EXTRA_CHECKS && defined(__GNUC__) && __GNUC__ >= 4 68 #define TDS_WUR __attribute__ ((__warn_unused_result__))