У меня немного необычная ситуация - я хочу использовать оператор goto, чтобы перейти в цикл, а не выпрыгнуть из него.
Для этого есть веские причины - этокод должен быть частью некоторой функции, которая выполняет некоторые вычисления после первого вызова, возвращает запрос новых данных и нуждается в еще одном вызове для продолжения.Указатели на функции (очевидное решение) нельзя использовать, потому что нам нужна совместимость с кодом, который не поддерживает указатели на функции.
Я хочу знать, безопасен ли приведенный ниже код, т. Е. Будет ли он корректно скомпилирован всеми стандартнымисовместимые компиляторы C / C ++ (нам нужны и C, и C ++).
function foo(int not_a_first_call, int *data_to_request, ...other parameters... )
{
if( not_a_first_call )
goto request_handler;
for(i=0; i<n; i++)
{
*data_to_request = i;
return;
request_handler:
...process data...
}
}
Я изучил стандарты, но информации о таком случае использования мало.Мне также интересно, будет ли замена для эквивалентной , тогда как будет выгодна с точки зрения переносимости.
Заранее спасибо.
UPD : Спасибо всем, кто прокомментировал!
всем комментаторам :) да, я понимаю, что не могу перепрыгнуть через инициализаторы локальных переменных и что мне нужносохранять / восстанавливать i
при каждом вызове.
по веским причинам :) Этот код должен реализовывать интерфейс обратной связи.Обратная связь - это шаблон кодирования, который пытается избежать использования указателей функций.Иногда его приходится использовать из-за устаревшего кода, который предполагает, что вы будете использовать его.
К сожалению, интерфейс r-comm не может быть реализован вхороший способВы не можете использовать указатели функций, и вы не можете легко разделить работу на несколько функций.