¿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 .. ;)