#c #ellipsis
#c #многоточие
Вопрос:
Я должен поддерживать старый фрагмент кода, который больше не работает корректно при компиляции на 64k машинах.
У меня есть функция «solve», вызывающая другую функцию «funct», переданную в качестве указателя:
int solve(double*x,double xA,double xB,double zeps,double funct(double x,double*),...)
Следовательно, «решить» можно использовать с различными возможными функциями, например :
double isDgood(double D,double*Y);
Из функции «solve» можно было вызвать функцию «funct» и получить доступ к ее аргументам с помощью:
fA=funct(xA,(double*)(amp;funct 1));"
Хотя я не знаком с этим синтаксисом, я предполагаю, что разработчик предполагал, что неуказанные аргументы были просто помещены в стек. Однако этот код больше не работает на платформах 64k. Как я могу исправить этот код? Должен ли я конкретно использовать Va_list?
Большое вам спасибо за вашу помощь.
Комментарии:
1. Да, для этого вам нужно было бы использовать механику VA. Как бы то ни было, это вызывает неопределенное поведение . (Который в течение многих лет выполнял то, что было целью кода.) Однако, разве это не было бы отличной возможностью модернизировать код? Используйте вместо этого объекты функции — вызывающий объект предоставляет аргументы конструктору объекта функции, а ваша
solve
функция вызывает только его. Вы даже можете создать их на лету с помощьюstd/boost::bind()
.2. большое вам спасибо за вашу помощь. Я попытаюсь использовать va_list. Еще раз спасибо!
Ответ №1:
Это ужасно неопределенное поведение. Если вы хотите получить доступ к аргументу, вам придется передавать их по кругу.