xem xét mã này (VS2008):Chuyển đến trước khi khởi tạo biến gây ra trình biên dịch lỗi
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);
}
}
Nếu điều quan trọng là: đây là mã từ một bài tập về nhà sử dụng để lọc ra và sửa đổi từ trong một tài liệu. document
giữ tài liệu (đọc trước đó từ tập tin)
tôi muốn giới thiệu một goto độc hại vì tôi nghĩ rằng nó thực sự sạch hơn trong trường hợp này như sau:
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);
}
}
hay không này là một sự lựa chọn thiết kế tốt là không thích hợp vào lúc này. Trình biên dịch than phiền error C2362: initialization of 'words' is skipped by 'goto SkipAndRestart'
Tôi không hiểu lỗi này. Tại sao nó quan trọng, và một lỗi, rằng các từ khởi tạo được bỏ qua? Đó là chính xác những gì tôi muốn xảy ra, tôi không muốn nó làm việc nhiều hơn, chỉ cần khởi động lại vòng lặp đẫm máu. Macro không tiếp tục làm nhiều hay ít chính xác điều tương tự?
Tôi đã nghĩ rằng đây chỉ là cảnh báo chứ không phải lỗi. Điều gì sẽ xảy ra nếu bạn chỉ sử dụng 'break' thay vì goto? –
Hầu hết mọi người có thể không đồng ý rằng phiên bản 'goto' là" sạch hơn "! –
@Oli: Tôi biết, đó là lý do tại sao tôi nói thiết kế thực tế của điều này là không liên quan; Tôi không muốn bắt đầu một cuộc chiến tranh lửa: P @Paul: Biên dịch. – IAE