紫红色OS fxl :: CommandLineFromArgcArgv()的用法?

时间:2020-03-11 18:43:34

标签: fuchsia

Fuchsia OS > Guides > Syslog包含以下示例:

#include "src/lib/fsl/syslogger/init.h"
#include "src/lib/fxl/command_line.h"
int main(int argc, char** argv) {
    auto command_line = fxl::CommandLineFromArgcArgv(argc, argv);
    fsl::InitLoggerFromCommandLine(command_line, {"my_program"});
}

Fuchsia OS > Reference未列出FXL:

enter image description here

搜索Fuchsia Project site的另一个例子是fxl::CommandLineFromArgcArgv()

我在哪里可以找到fxl::CommandLineFromArgcArgv()上的参数,返回值和其他详细信息?

1 个答案:

答案 0 :(得分:1)

fxl API尚未作为正式的紫红色参考文献的一部分进行记录。

fxl目录(link)中的自述文件:

在理想的世界中,FXL将不存在,我们可以使用C ++标准库的构造块。 [...]我们想保持FXL较小,并专注于“修复” C ++标准库的问题,这意味着您可能不应该将其放入FXL中,除非它与C ++的特定缺陷有关标准库。

基于此陈述,似乎fxl并未设置为长期项目,而当C ++标准库已得到充分改编时,它的意思是变成空白/过时。出于这个原因,记录工作可能受到限制。

我们必须依靠直接在标题(link)中提供的文档:

// Builds a |CommandLine| from the usual argc/argv.
inline CommandLine CommandLineFromArgcArgv(int argc, const char* const* argv)

CommandLine类在同一标头中定义。根据评论,它区分了可选参数和位置参数。可选参数的格式为--key=value--key(无值),而不是--key value。位置参数以不具有这种形式的第一个参数(或特殊的--分隔符)开头。

CommandLine成员函数是:

  • 访问程序名称(从argv[0]):

    bool has_argv0() const;
    const std::string& argv0() const;
    
  • 访问可选参数和位置参数(Option是具有成员std::string name / std::string value的简单结构):

    const std::vector<Option>& options() const;
    const std::vector<std::string>& positional_args() const;
    
  • 比较:

    bool operator==(const CommandLine& other) const;
    bool operator!=(const CommandLine& other) const;
    
  • 访问可选参数:

    bool HasOption(StringView name, size_t* index = nullptr) const;
    bool GetOptionValue(StringView name, std::string* value) const;
    std::vector<StringView> GetOptionValues(StringView name) const;
    std::string GetOptionValueWithDefault(StringView name, StringView default_value) const;
    

我们可以编写以下示例程序(使用structured-binding语法):

#include <iostream>
#include "src/lib/fxl/command_line.h"

int main(int argc, char** argv) {
  const auto cl = fxl::CommandLineFromArgcArgv(argc, argv);

  std::cout << "Program name = " << cl.argv0() << std::endl;

  std::cout << "Optional: " << cl.options().size() << std::endl;

  for (const auto& [name,value] : cl.options()) {
    std::cout << name << " -> " << value << std::endl;
  }

  std::cout << "Positional: " << cl.positional_args().size() << std::endl;

  for (const auto& arg : cl.positional_args()) {
    std::cout << arg << std::endl;
  }

  return 0;
}

编译程序后(基于this的答案),我们可以得到以下输出(演示第一个位置参数filename如何将所有随后的参数转换为位置参数):

$ hello_world_cpp --k1=v1 --k2 --k3=v3 filename --k4=v4
Program name = hello_world_cpp
Optional: 3
k1 -> v1
k2 ->
k3 -> v3
Positional: 2
filename
--k4=v4

--用作分隔符:

$ hello_world_cpp --k1=v1 -- --k2=v2
Program name = hello_world_cpp
Optional: 1
k1=v1
Positional: 1
--k2=v2

我们可以使用HasOption进行简单的参数解析:

    size_t index;

    if (cl.HasOption("key", &index)) {
      handle_key(cl.options.at(index).value);
    }

将其添加到我们的程序中并使用--key=abc进行调用会将abc传递给handle_key