From 10eac9658672059ec476ff05382d1e63f064c90e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20du=20Hamel?= Date: Thu, 14 Aug 2025 13:45:01 +0200 Subject: [PATCH] cli: show usage on unknown arg --- examples/cli/main.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/examples/cli/main.cpp b/examples/cli/main.cpp index ec04dfde3..20057ac3b 100644 --- a/examples/cli/main.cpp +++ b/examples/cli/main.cpp @@ -297,10 +297,12 @@ bool parse_options(int argc, const char** argv, ArgOptions& options) { bool invalid_arg = false; std::string arg; for (int i = 1; i < argc; i++) { + bool found_arg = false; arg = argv[i]; for (auto& option : options.string_options) { if ((option.short_name.size() > 0 && arg == option.short_name) || (option.long_name.size() > 0 && arg == option.long_name)) { + found_arg = true; if (++i >= argc) { invalid_arg = true; break; @@ -314,6 +316,7 @@ bool parse_options(int argc, const char** argv, ArgOptions& options) { for (auto& option : options.int_options) { if ((option.short_name.size() > 0 && arg == option.short_name) || (option.long_name.size() > 0 && arg == option.long_name)) { + found_arg = true; if (++i >= argc) { invalid_arg = true; break; @@ -327,6 +330,7 @@ bool parse_options(int argc, const char** argv, ArgOptions& options) { for (auto& option : options.float_options) { if ((option.short_name.size() > 0 && arg == option.short_name) || (option.long_name.size() > 0 && arg == option.long_name)) { + found_arg = true; if (++i >= argc) { invalid_arg = true; break; @@ -340,6 +344,7 @@ bool parse_options(int argc, const char** argv, ArgOptions& options) { for (auto& option : options.bool_options) { if ((option.short_name.size() > 0 && arg == option.short_name) || (option.long_name.size() > 0 && arg == option.long_name)) { + found_arg = true; if (option.keep_true) { *option.target = true; } else { @@ -353,6 +358,7 @@ bool parse_options(int argc, const char** argv, ArgOptions& options) { for (auto& option : options.manual_options) { if ((option.short_name.size() > 0 && arg == option.short_name) || (option.long_name.size() > 0 && arg == option.long_name)) { + found_arg = true; int ret = option.cb(argc, argv, i); if (ret < 0) { invalid_arg = true; @@ -364,6 +370,10 @@ bool parse_options(int argc, const char** argv, ArgOptions& options) { if (invalid_arg) { break; } + if (!found_arg) { + fprintf(stderr, "error: unknown argument: %s\n", arg.c_str()); + return false; + } } if (invalid_arg) { fprintf(stderr, "error: invalid parameter for argument: %s\n", arg.c_str());