Ho alcuni codeIl modo migliore per emulare __typeof__ per msvc o soluzione alternativa?
#define DEBUG_PRINT(x,...) \
do \
{\
_Pragma("GCC diagnostic push") \
_Pragma("GCC diagnostic ignored \"-Wunused-value\"") \
__typeof__((0,x)) _x = x; \
_Pragma("GCC diagnostic pop") \
DEBUG_PRINT_PTR((#x), &_x, __VA_ARGS__);\
} while(0)
//The repetition of debug_print_printf_specifier is to avoid repetition for custom types.
#define DEBUG_PRINT_PTR(xstr, xp,...) \
_Generic((*xp), \
const char *: debug_print_printf_specifier(xstr, (void *)xp, TYPE_PTR_TO_PRINTF_SPECIFIER(xp), __FILE__, __LINE__, _my_func__, debug_print_options_apply_group_options(&((debug_print_options){__VA_ARGS__}))),\
char *: debug_print_printf_specifier(xstr, (void *)xp, TYPE_PTR_TO_PRINTF_SPECIFIER(xp), __FILE__, __LINE__, _my_func__, debug_print_options_apply_group_options(&((debug_print_options){__VA_ARGS__}))),\
int: debug_print_printf_specifier(xstr, (void *)xp, TYPE_PTR_TO_PRINTF_SPECIFIER(xp), __FILE__, __LINE__, _my_func__, debug_print_options_apply_group_options(&((debug_print_options){__VA_ARGS__}))),\
float: debug_print_printf_specifier(xstr, (void *)xp, TYPE_PTR_TO_PRINTF_SPECIFIER(xp), __FILE__, __LINE__, _my_func__, debug_print_options_apply_group_options(&((debug_print_options){__VA_ARGS__}))),\
double: debug_print_printf_specifier(xstr, (void *)xp, TYPE_PTR_TO_PRINTF_SPECIFIER(xp), __FILE__, __LINE__, _my_func__, debug_print_options_apply_group_options(&((debug_print_options){__VA_ARGS__}))),\
char: debug_print_printf_specifier(xstr, (void *)xp, TYPE_PTR_TO_PRINTF_SPECIFIER(xp), __FILE__, __LINE__, _my_func__, debug_print_options_apply_group_options(&((debug_print_options){__VA_ARGS__}))),\
int16_t: debug_print_printf_specifier(xstr, (void *)xp, TYPE_PTR_TO_PRINTF_SPECIFIER(xp), __FILE__, __LINE__, _my_func__, debug_print_options_apply_group_options(&((debug_print_options){__VA_ARGS__}))),\
uint16_t: debug_print_printf_specifier(xstr, (void *)xp, TYPE_PTR_TO_PRINTF_SPECIFIER(xp), __FILE__, __LINE__, _my_func__, debug_print_options_apply_group_options(&((debug_print_options){__VA_ARGS__}))),\
uint32_t: debug_print_printf_specifier(xstr, (void *)xp, TYPE_PTR_TO_PRINTF_SPECIFIER(xp), __FILE__, __LINE__, _my_func__, debug_print_options_apply_group_options(&((debug_print_options){__VA_ARGS__}))),\
int64_t: debug_print_printf_specifier(xstr, (void *)xp, TYPE_PTR_TO_PRINTF_SPECIFIER(xp), __FILE__, __LINE__, _my_func__, debug_print_options_apply_group_options(&((debug_print_options){__VA_ARGS__}))),\
uint64_t: debug_print_printf_specifier(xstr, (void *)xp, TYPE_PTR_TO_PRINTF_SPECIFIER(xp), __FILE__, __LINE__, _my_func__, debug_print_options_apply_group_options(&((debug_print_options){__VA_ARGS__}))),\
default: DEBUG_PRINT_CUSTOM_TYPE(xstr, xp, __VA_ARGS__))
#define DEBUG_PRINT_CUSTOM_TYPE(xstr, xp,...) \
debug_print_custom_to_debug_string(xstr, xp, &((dsc_func_ptr){GET_CREATE_DEBUG_STRING_FUNC(xp)}), __FILE__, __LINE__, _my_func__,\
debug_print_options_apply_group_options(&((debug_print_options){__VA_ARGS__})))
#define GET_CREATE_DEBUG_STRING_FUNC(x) _Generic((x), \
debug_print_options *: debug_print_options_to_debug_string, \
debug_print_group_options *: debug_print_group_options_to_debug_string, \
default: print_not_valid_type_for_debug_print)
Ho bisogno di un puntatore a x
in DEBUG_PRINT
che può essere una variabile o un'espressione. Per supportare le espressioni, lo assegno ad un temporaneo e poi ne prendo l'indirizzo. Potrei emulare __typeof__
con _Generic
per un numero limitato di tipi, ma poi gli utenti avrebbero bisogno di aggiungere linee per i tipi personalizzati in 2 posizioni. C'è un altro modo di fare questo? Sarei ok solo con il supporto dell'ultimo compilatore Microsoft C.
MSVC10 + ha 'decltype'. Non sono sicuro se sia accessibile dal codice C. –
MSVC non implementa '_Generic' o' _Pragma'. Se hai/vuoi usare Visual Studio, usa 'clang-cl' o C++ per la programmazione generica. – cremno
_Pragma è solo per sopprimere gli avvertimenti, anche MSVC supporta __pragma che è simile (https://msdn.microsoft.com/en-us/library/d9x1s805.aspx) –