首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Fuchsia OS fxl::CommandLineFromArgcArgv()用法?

Fuchsia OS fxl::CommandLineFromArgcArgv()用法?
EN

Stack Overflow用户
提问于 2020-03-11 18:43:34
回答 1查看 81关注 0票数 1

Fuchsia OS > Guides > Syslog有以下示例:

代码语言:javascript
复制
#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:

紫红色工程场地的搜索还有一个有fxl::CommandLineFromArgcArgv()的示例。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-19 18:32:15

fxl API并没有作为官方的Fuchsia引用的一部分进行记录(目前为止)。

来自fxl目录(链接)中的自述文件:

在理想的世界中,FXL是不存在的,我们可以使用C++标准库的构建块。..。我们希望将FXL保持较小,并将重点放在“修复”C++标准库的问题上,这意味着您可能不应该将您的东西放在FXL中,除非它与C++标准库的特定缺陷有关。

基于这一声明,fxl似乎不是作为一个长期项目设置的,而是意味着在C++标准库已经充分适应的情况下成为空/过时的。由于这个原因,文件工作可能受到限制。

我们必须依赖直接在标头(链接)中提供的文档:

代码语言:javascript
复制
// Builds a |CommandLine| from the usual argc/argv.
inline CommandLine CommandLineFromArgcArgv(int argc, const char* const* argv)

CommandLine类在同一个标头中定义。根据注释,它区分了可选的和位置的args。可选参数的形式是--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::Vector&Options() const;const std::vector& positional_args() const;
  • 比较: bool operator==(const CommandLine&其他) const;bool运算符!=(const CommandLine&其他) const;
  • 访问可选参数: bool HasOption(StringView名称,size_t*索引= nullptr) const;bool GetOptionValue(StringView名称,std::string* value) const;std::vector ( StringView name) const;std::string GetOptionValueWithDefault(StringView name,StringView default_value) const;

我们可以编写以下示例程序(使用结构化绑定语法):

代码语言:javascript
复制
#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;
}

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

代码语言:javascript
复制
$ 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

演示--作为分隔符:

代码语言:javascript
复制
$ hello_world_cpp --k1=v1 -- --k2=v2
Program name = hello_world_cpp
Optional: 1
k1=v1
Positional: 1
--k2=v2

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

代码语言:javascript
复制
    size_t index;

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

将其添加到我们的程序并使用--key=abc调用它,然后将abc传递给handle_key

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60642617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档