2015-08-18 3 views
1

Я являюсь участником проекта, который использует C++ 11. Я не уверен, когда должен использовать код ошибки для возвращаемых значений. Я нашел RVO в C++ отлично работает, даже если строка и struct данные возвращаются напрямую. Но если я использую код возврата, я не могу получить выгоду от RVO, и код немного лишний.Каков наилучший способ использования кода ошибки в C++?

Итак, каждый раз, когда я объявляю функцию, я не мог решить, для чего я должен использовать для возвращаемого значения. Как я должен соблюдать последовательность моего кода? Любой совет поможет мне.

// return string 
MyError getString(string& out); 
string getString(); 

// return struct 
MyError getStructData(MyStruct& out); 
MyStruct getStructData(); 
+0

Если исключения недоступны, попробуйте вернуть 'boost :: variant '. –

+0

Я не знал boost :: variant. Хотя это выглядит полезно, я не мог использовать boost в своем проекте из-за политики моего проекта. В любом случае, спасибо за ваш совет! – jef

ответ

3

Как правило, использование исключений вместо кодов ошибок является предпочтительной альтернативой в C++. У этого есть несколько причин:

  • Как уже отмечалось, с помощью кодов ошибок возвращаемых значений не позволяет вам использовать возвращаемые значения для чего-то более «естественным»
  • Глобальные коды ошибок, не THREADSAFE и имеют ряд других проблем
  • кода ошибок может быть проигнорирована, исключения могут не
  • код ошибок должны быть оценены после каждого вызова функции, которые могли бы, возможно, не получится, так что вы должны засорять свой код обработки ошибок логика
  • исключения может быть брошена и прошла несколько слоев вверх e стоп без дополнительной обработки

Конечно, существуют среды, где исключения недоступны, часто из-за ограничений платформы, например. во встроенном программировании. В таких случаях коды ошибок являются единственным вариантом.

Однако, если вы используете коды ошибок, согласитесь с тем, как вы их передаете. Наиболее привлекательное использование кодов ошибок, которые я видел, которые не занимают пятно возвращаемого значения и по-прежнему является потокобезопасным, было ссылкой на объект контекста в каждой функции. Объект контекста будет иметь глобальную информацию или информацию о потоках, включая коды ошибок для последних функций.

+0

Благодарим вас за советы. Как упоминалось выше, исключения подходят для того, что разработчики вынуждены обрабатывать ошибки. – jef

Смежные вопросы