c - Best way to emulate __typeof__ for msvc or alternative workaround? -
i have code
#define debug_print(x,...) \ \ {\ _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 avoid repetition 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) i need pointer x in debug_print may variable or expression. support expressions assign temporary , take address of that. emulate __typeof__ _generic limited set of types users need add lines custom types in 2 places. there other way this? i'd ok supporting latest microsoft c compiler.
char: debug_print_printf_specifier("x"//z.str, (void *)xp, \ type_ptr_to_printf_specifier(xp), __file__, __line__, _my_func__, \ debug_print_options_apply_group_options(&((debug_print_options{__va_args__}))),\ z=ptr.x //just create ptr z x... :d simple .. ;)
Comments
Post a Comment