gpt4 book ai didi

c - 在 C 中将 const char 参数传递给 static char *argv[] 的语法

转载 作者:行者123 更新时间:2023-12-02 09:33:56 27 4
gpt4 key购买 nike

好吧,我正在尝试构建一个守护进程(对于 Debian 机器),它将获取它接收到的命令行参数(通过 cron)并将它们传递给不同的脚本文件。

守护进程的 main()

 int main(int argc , char *argv[])
{
if(argc != 3)
{
exit(0);
}

daemonize(argv[1], argv[2]);

return 0;
}

并且函数 daemonize 已进行此设置

int daemonize(const char *cmd1, const char *cmd2) {...}

daemonize 中令人不安的部分在这里:

if (strcmp(cmd1,"sample_script") == 0)
{
static char *argv[] = {"/etc/init.d/sample_script", ["%s",cmd2], NULL };
execv("/etc/init.d/sample_script",argv);
exit(127);
}

上线

static char *argv[] = {"/etc/init.d/sample_script", ("%s",cmd2), NULL };

我收到此错误

initializer element is not constant (near initialization for ‘argv[1]’)

显然("%s",cmd2)是错误的。因为使用“start”效果很好。

那么,如何将 cmd2 正确放入 *argv[] 中?还是我做错了什么?

最佳答案

你需要改变

static char *argv[] = {"/etc/init.d/sample_script", ["%s",cmd2], NULL };

const char *argv[] = {"/etc/init.d/sample_script", cmd2, NULL };

您必须删除 static 关键字。根据 C11 标准第 6.7.9 章,

All the expressions in an initializer for an object that has static or thread storage duration shall be constant expressions or string literals.

也就是说,在 C 语言中,具有静态存储持续时间的对象必须使用常量表达式或包含常量表达式的聚合初始值设定项进行初始化。

并且,关于常量表达式,来自同一文档的第 6.6 章

A constant expression can be evaluated during translation rather than runtime, and accordingly may be used in any place that a constant may be.

因此,在 C 中,变量(名称)即使声明为 const 也绝不是常量表达式


编辑:

要解决最新问题,您可以尝试以下操作

  1. 更改 int daemonize(char *cmd1, char *cmd2) {..
  2. 使用 char * const argv[] = {"/etc/init.d/sample_script", cmd2, NULL };

并且您可以保持其余代码不变。

关于c - 在 C 中将 const char 参数传递给 static char *argv[] 的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29384485/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com