18

bazı codemsvc veya alternatif bir geçici çözüm için __typeof__ öykünmenin en iyi yolu?

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

bir değişken ya da bir ifade de olabilir DEBUG_PRINT içinde x bir işaretçi mi var. İfadeleri desteklemek için onu geçici olarak atarım ve sonra bunun adresini alırım. 'u _Generic ile sınırlı bir tür kümesi için taklit edebilirdim, ancak kullanıcıların 2 yerde özel türler için çizgiler eklemesi gerekir. Bunu yapmanın başka bir yolu var mı? En yeni Microsoft C derleyicisini destekleyerek tamam olurdum.

+0

MSVC10 + 'decltype' sahiptir. C kodundan erişilebilir olup olmadığından emin değil. –

+3

MSVC, '_Generic' veya' _Pragma''yı uygulamıyor. Visual Studio'yu kullanmak/kullanmak istiyorsanız, jenerik programlama için 'clang-cl' veya C++ kullanın. – cremno

+0

_Pragma sadece uyarıları bastırmak için, aynı zamanda MSVC benzer olan __pragma'yı destekler (https://msdn.microsoft.com/en-us/library/d9x1s805.aspx) –

cevap

-4
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 

bu kadar basit ..;)

+5

Lütfen çözümün daha ayrıntılı tanımını ekleyin ve kodu biçimlendirin. –

İlgili konular