这让我发疯:
我有功能
void gst_init(int *argc, char **argv[]);
在 gstreamer api 中,我想用我定义的一些参数调用它,例如:
int argc = 2;
char* argv[2] = {"myvalue1", "myvalue2"};
gst_init(&argc, &argv);
此代码无法编译(我收到错误 C2664):
error C2664: 'gst_init' : cannot convert parameter 2 from 'char *(*)[2]' to 'char **[]'
问题:我如何定义 argv
值以将其作为参数传递?我已经使用 C++ 超过 5 年了年,但自从……我想是高中(五年多以前)以来我就没有使用过原始数组。
编辑:我正在使用 VS2010 Express。
最佳答案
通常您会按照 manual 中的说明进行操作,并将指针传递给 main
提供的参数,以便 gstreamer 可以删除它处理的参数。
#include <stdio.h>
#include <gst/gst.h>
int main ( int argc, char *argv[] )
{
gst_init (&argc, &argv);
// handle the remaining argc values of argv
如果您想创建自己的参数,请创建与 main
相同类型的数组:
void gst_init(int *argc, char **argv[])
{
// strip one argument
--*argc;
++*argv;
}
void foo ()
{
int argc = 2;
char* args[] = {"myvalue1", "myvalue2"};
char** argv = args;
for(int i= 0; i < argc; ++i)
printf("%s\n", argv[i]);
gst_init(&argc, &argv);
for(int i= 0; i < argc; ++i)
printf("%s\n", argv[i]);
}
如果您不使用 C99,则使用一个单独的指针指向本地字符串数组会更容易。使用 C99,您可以只编写 char** argv = (char*[]){"myvalue1", "myvalue2"};
以指向匿名数组中第一个元素的指针开始。
您需要传递一个指向数组的变量指针,而不是指向数组第一个元素的指针;在第一种情况下,将数组参数降级为指针与第二种情况声明指针局部变量的效果相同——然后您可以传递该变量的地址,函数可以修改它。 sizeof(args) 在 32 位机器上是 8,因为编译器推导出数组中元素的数量; sizeof(argv) 为 4,因此++args 会将指针移动到数组的末尾,而不是像++argv 那样移动到下一个元素。编译器会保护您免受此类操作。
但通常您会按照手册建议的方式使用它。
关于c++ - 如何将数组作为参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3093116/