Добре, разбрах заобиколно решение:
#define ASSERT_LIST_TYPE(t, l...) do{t _t[] = {l};}while(0)
void _Log(char* what, ...);
#define Log(what, args...) do{\
ASSERT_LIST_TYPE(char*, args);\
_Log(what, args);\
}while(0)
Това поне генерира предупреждение, ако аргументите не са от правилния тип, тъй като инициализацията на фиктивния масив не е от правилния тип.
Планирам #ifdef'ing на ASSERT_LIST_TYPE, ако това не е компилация за отстраняване на грешки за всеки случай..
** Редактиране **
Въз основа на обратната връзка тук промених кода да изглежда така:
void _Log(char* what, const char** args, size_t args_len);
#define Log(what, args...) do{\
const char* a[] = {args};\
_Log(what, a, (sizeof a)/sizeof(char*));
}while(0)
Изглежда, че това работи дори ако args е празен и хваща някой, който предава obj-c литерал низ вместо (@"..." вместо "..."), което ме ухапа преди.
person
Mark Pauley
schedule
23.01.2014