Я должен использовать компилятор IAR во встроенном приложении (у него нет пространств имен, исключений, множественного/виртуального наследования, шаблоны ограничены по битам и поддерживается только С++ 03). Я не могу использовать пакет параметров, поэтому я попытался создать функцию-член с переменным параметром. Я знаю, что переменные параметры, как правило, небезопасны. Но безопасно ли использовать this
указатель в макросе va_start
?
Если бы я использовал обычную функцию с переменным числом аргументов, то перед тем ...
чтобы получить доступ к остальным параметрам, понадобился бы фиктивный параметр. Я знаю, что макросу variadic не нужен параметр раньше ...
но я бы предпочел не использовать его. Если я использую функцию-член, она скрывала this
параметр раньше ...
поэтому я попробовал:
struct VariadicTestBase{
virtual void DO(...)=0;
};
struct VariadicTest: public VariadicTestBase{
virtual void DO(...){
va_list args;
va_start(args, this);
vprintf("%d%d%d\n",args);
va_end(args);
}
};
//Now I can do
VariadicTestBase *tst = new VariadicTest;
tst->DO(1,2,3);
tst->DO(1,2,3);
печатает 123, как и ожидалось. Но я не уверен, что это не просто случайное/неопределенное поведение. Я знаю tst->DO(1,2);
рухнул бы так же, как обычный принф. Я не возражаю.