c method-overloading typeof visual-studio-2012 printf-debugging

¿La mejor manera de emular__typeof__ para msvc o una solución alternativa?



method-overloading visual-studio-2012 (1)

Tengo un código

#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)

Necesito un puntero a x en DEBUG_PRINT que puede ser una variable o una expresión. Para admitir expresiones, las asigno a un temporal y luego tomo la dirección de eso. Podría emular __typeof__ con _Generic para un conjunto limitado de tipos, pero los usuarios tendrían que agregar líneas para tipos personalizados en 2 lugares. Hay alguna otra manera de hacer esto? Estaría bien si solo soporte el último compilador de Microsoft C.


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 a ptr z for x... :D

simple como eso .. ;)