【问题标题】:Creating the execv argument array when the arguments are unknown at compile time在编译时参数未知时创建 execv 参数数组
【发布时间】:2021-11-09 05:04:39
【问题描述】:

我正在尝试恢复一个内部 CAM 应用程序,即让它在当前的 gcc 上编译,以便我可以维护它。作为偶尔的 C/C++ hack,我有 27 年的经验;-)

有问题的部分是命令行核心,所以没有 UI。它有一种前端,可以对其输入参数进行一些检查和操作,并将它们移动到一个新的 argv 中,execv 使用它来切换到完成实际工作的 2 个不同可执行文件中的一个。

现有代码包含 5 个不同的 CL 选项,尽管据我所知,通常只使用 2 个。当尝试在声明中使用大括号括起来的列表以外的任何方式填充新的 argv (char* const new_argv[32]) 时,编译器说我只能使用大括号括起来......

我已经用 Google 搜索了 2 天,但没有令人信服的结果。有没有一种巧妙的方法可以做到这一点,或者只是丑陋的蛮力方式?整个设计是否存在严重问题?

【问题讨论】:

  • 我不确定您对“丑陋的蛮力方式”有何想法。通常,您只需遍历数组,为每个元素分配一个指向所需字符串的指针。请注意,您必须从声明中删除 const 才能填充它。
  • 你对丑陋的蛮力方式是什么意思?
  • 你是否可以结束句子编译器说我只能用大括号括起来......?编译器对你说什么......它会打印一条消息吗?你能编辑你的问题并告诉编译器说的确切信息是什么吗?
  • 好文章 Remy,谢谢。我想到的“蛮力”方式是所有可能的 arg 组合的 switch case,并且由于范围界定,在每个组合中调用 exec 的方式都不同。这将是可怕的。我没有想到 execv 足够聪明,可以自己将 char* 转换为 char* const,所以@dbush 的答案有效。谢谢大家

标签: c++ arrays c constants execv


【解决方案1】:

将数组的类型更改为char *[],然后您可以分配给每个数组成员,然后再将其传递给execv

这是允许的,因为char *[] 可以转换为char * const[],但不能转换为const char *[]const char * const[]

【讨论】:

  • 好吧,我没想到我能侥幸逃脱。太棒了,谢谢@dbush
  • @MattWalker 很高兴我能帮上忙。如果您觉得有用,请随时 accept this answer
  • 呃,抱歉 - 按钮也太明显了,所以我错过了 ;-)
猜你喜欢
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 2013-05-17
  • 2021-10-20
  • 2013-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多