Considere este código (VS2008):Goto antes de la inicialización variable causa de error del compilador
void WordManager::formatWords(std::string const& document)
{
document_ = document;
unsigned int currentLineNo = 1;
size_t oldEndOfLine = 0;
size_t endOfLine = document_.find('\n');
while(endOfLine != std::string::npos)
{
std::string line = document_.substr(oldEndOfLine, (endOfLine - oldEndOfLine));
if(line.size() < 2)
{
oldEndOfLine = endOfLine + 1;
endOfLine = document_.find('\n', oldEndOfLine);
continue;
}
std::vector<std::string> words = Utility::split(line);
for(unsigned int i(0); i < words.size(); ++i)
{
if(words[i].size() < 2)
continue;
Utility::trim(words[i], WordManager::delims);
Utility::normalize(words[i], WordManager::replace, WordManager::replaceWith);
if(ruleOne(words[i]) && ruleTwo(words[i]))
{
std::set<Word>::iterator sWIter(words_.find(Word(words[i])));
if(sWIter == words_.end())
words_.insert(Word(words[i])).first->addLineNo(currentLineNo);
else
sWIter->addLineNo(currentLineNo);
}
}
++currentLineNo;
oldEndOfLine = endOfLine + 1;
endOfLine = document_.find('\n', oldEndOfLine);
}
}
Si es importante: se trata de un código de asignación de la preparación se usa para filtrar y modificar palabras en un documento. document
sostiene el documento (leer previamente de archivo)
Deseo introducir un Goto maliciosa, porque creo que en realidad es más limpio, en este caso, así:
void WordManager::formatWords(std::string const& document)
{
document_ = document;
unsigned int currentLineNo = 1;
size_t oldEndOfLine = 0;
size_t endOfLine = document_.find('\n');
while(endOfLine != std::string::npos)
{
std::string line = document_.substr(oldEndOfLine, (endOfLine - oldEndOfLine));
// HERE!!!!!!
if(line.size() < 2)
goto SkipAndRestart;
std::vector<std::string> words = Utility::split(line);
for(unsigned int i(0); i < words.size(); ++i)
{
if(words[i].size() < 2)
continue;
Utility::trim(words[i], WordManager::delims);
Utility::normalize(words[i], WordManager::replace, WordManager::replaceWith);
if(ruleOne(words[i]) && ruleTwo(words[i]))
{
std::set<Word>::iterator sWIter(words_.find(Word(words[i])));
if(sWIter == words_.end())
words_.insert(Word(words[i])).first->addLineNo(currentLineNo);
else
sWIter->addLineNo(currentLineNo);
}
}
SkipAndRestart:
++currentLineNo;
oldEndOfLine = endOfLine + 1;
endOfLine = document_.find('\n', oldEndOfLine);
}
}
Si es o no es una elección buen diseño es irrelevante en este momento. El compilador se queja error C2362: initialization of 'words' is skipped by 'goto SkipAndRestart'
No entiendo este error. ¿Por qué es importante, y es un error, que se omita la inicialización de las palabras? Eso es exactamente lo que quiero que suceda, no quiero que haga más trabajo, solo reinicie el bucle sangriento. ¿La macro continua no hace más o menos exactamente lo mismo?
Hubiera pensado que esto solo sería una advertencia, no un error. ¿Qué sucede si solo usas 'break' en lugar de goto? –
¡La mayoría de la gente probablemente no estaría de acuerdo con que la versión 'goto' sea" más limpia "! –
@Oli: Lo sé, por eso dije que el diseño real de la cosa es irrelevante; No quiero comenzar una guerra de llama: P @Paul: compila. – IAE