如何修复C++中非void函数未在所有控制路径返回值的警告?
修复C++ non-void函数未在所有控制路径返回值的警告
警告:non-void function does not return a value in all control paths...
你已经明确了警告的核心:当目标参数不存在(遍历完所有循环都没找到匹配项,或找到参数但无"value"字段)时,函数没有返回值,而指定的具体类型(如bool)无法返回NULL。以下是几种可行的修复方案:
方案1:抛出异常
当找不到参数或对应值时,抛出标准异常,让调用方负责处理错误场景,确保函数所有路径都有明确的终止逻辑。
修改后的代码:
#include <stdexcept> template<typename T> auto get(std::string argument_name) -> T { if (argument_name.length() <= 2) { argument_name = "-" + helpers::convert_string_tolower(argument_name); } else { argument_name = "--" + helpers::convert_string_tolower(argument_name); } for (const auto &p_n: parser.storage | std::views::keys) { for (const auto &[a_s_n, a_l_n] : parser.storage[p_n] | std::views::keys) { if (argument_name == a_s_n || argument_name == a_l_n) { ArgumentNamePair a_p = std::make_pair(a_s_n, a_l_n); if (parser.storage[p_n][a_p].contains("value")) { return std::get<T>(parser.storage[p_n][a_p]["value"]); } throw std::invalid_argument("找到参数但未设置值"); } } } throw std::invalid_argument("未找到指定参数:" + argument_name); }
调用时的异常处理示例:
ArgumentParser program(""); try { bool arg = program.get<bool>("argument_1"); // 使用参数值 } catch (const std::invalid_argument& e) { std::cerr << e.what() << std::endl; }
方案2:返回可选类型(C++17+)
改用std::optional<T>作为返回类型,找不到值时返回std::nullopt,既满足类型要求,又能明确表示"无有效返回值"的状态。
修改后的代码:
#include <optional> template<typename T> auto get(std::string argument_name) -> std::optional<T> { if (argument_name.length() <= 2) { argument_name = "-" + helpers::convert_string_tolower(argument_name); } else { argument_name = "--" + helpers::convert_string_tolower(argument_name); } for (const auto &p_n: parser.storage | std::views::keys) { for (const auto &[a_s_n, a_l_n] : parser.storage[p_n] | std::views::keys) { if (argument_name == a_s_n || argument_name == a_l_n) { ArgumentNamePair a_p = std::make_pair(a_s_n, a_l_n); if (parser.storage[p_n][a_p].contains("value")) { return std::get<T>(parser.storage[p_n][a_p]["value"]); } return std::nullopt; } } } return std::nullopt; }
调用时的处理示例:
ArgumentParser program(""); std::optional<bool> arg_opt = program.get<bool>("argument_1"); if (arg_opt.has_value()) { bool arg = arg_opt.value(); // 使用参数值 } else { std::cerr << "参数不存在或未设置值" << std::endl; }
方案3:允许传入默认值
新增默认值参数,当找不到参数或对应值时返回该默认值,确保函数始终有符合类型要求的返回值。
修改后的代码:
template<typename T> auto get(std::string argument_name, T default_val) -> T { if (argument_name.length() <= 2) { argument_name = "-" + helpers::convert_string_tolower(argument_name); } else { argument_name = "--" + helpers::convert_string_tolower(argument_name); } for (const auto &p_n: parser.storage | std::views::keys) { for (const auto &[a_s_n, a_l_n] : parser.storage[p_n] | std::views::keys) { if (argument_name == a_s_n || argument_name == a_l_n) { ArgumentNamePair a_p = std::make_pair(a_s_n, a_l_n); if (parser.storage[p_n][a_p].contains("value")) { return std::get<T>(parser.storage[p_n][a_p]["value"]); } return default_val; } } } return default_val; }
调用示例:
ArgumentParser program(""); bool arg = program.get<bool>("argument_1", false); // 未找到时默认返回false
内容的提问来源于stack exchange,提问作者Marius Romeiser
相关产品推荐
相关产品推荐

