Учитывая ваш код, ...
void initFFmpeg(string url ,string container, int w, int h, int fps)
{// we want to return here
encoder.SetConstants(fps, videoWidth, videoHeight, audioSampleRate);
// ... more code...
if (encoder.InitUrl(container, url, outputUserName) == -1)
{
// ...some more code...
// Now we want to return
}
// ... more code here...
}
... и предполагая, что вы действительно хотите снова вызвать SetConstants
, когда InitUrl
не удастся, естественный способ выразить желаемое "возвращение""использовать оператор C ++ return
, например ...
bool initEncoder(
string const& url,
string const& container,
string const& userName
)
{
encoder.SetConstants( fps, videoWidth, videoHeight, audioSampleRate );
// ... more code...
if( encoder.InitUrl( container, url, userName ) == -1 )
{
// ...some more code...
// Now we want to return, so:
return false;
}
return true;
}
void initFFmpeg( string const& url ,string const& container, int w, int h, int fps )
{
while( !initEncoder( url, container, outputUserName ) )
{}
// ... more code here...
}
Вы также можете делать это с исключениями.Это может быть более понятно, но, вероятно, будет менее эффективным.Предполагая, что повторы являются общими.
Или, вы можете использовать continue
в цикле for(;;)
.Мне не нравится continue
, и он мало используется (по крайней мере, как сообщалось в Google Code Search несколько лет назад).Но это может быть только то, что доктор прописал в отношении убеждений коллег о том, что такое хороший код.
Примечание: технически также возможно использовать goto
, но помимо использования в машинно-сгенерированном кодеэто лучше всего избегать.Для справки об этом см. Оригинальную статью Дейкстры 1968 года «Идти к вредным» .Хотя по состоянию на 2010 год ему 42 года, это все еще драгоценный камень - и лучше всего не забыт .