1

在 C 中使用字符串指针进行类型对话时需要一些帮助。我有一个函数可以获取*argvfrom 主循环以将命令行参数传递给它。由于参数是固定的,我试图给*argv它自己的样式参数,但 gcc 每次都会给出警告:

passing argument 2 of ‘DirectFBInit’ from incompatible pointer type

代码:

int main (int argc, char *argv[])
{
  ...
  char *argx[2] = {"self","--dfb:no-vt"};
  char *argxPtr = argx;

  DFBCHECK (DirectFBInit (&fakeArgc, &argxPtr));
  ...
}

我应该提到该功能是操纵argv(因此是argx)。

以下是 的定义DirectFBInit

DFBResult DirectFBInit(
                     int         *argc,    /* pointer to main()'s argc */
                     char      *(*argv[])  /* pointer to main()'s argv */
                  );

prog 正在运行,但我很担心。

4

4 回答 4

3

DirectFB的网站可能有有用的信息。

您的代码可能应该是:

int main(int argc, char **argv)
{
    ...
    char  *argvxData[] = { "self", "--dfb:no-vt", 0 };
    char **argvx       = argvxData;
    int    argcx       = 2;

    DFBCHECK(DirectFBInit(&argcx, &argvx));
    ...
}

注意添加的空指针以匹配程序argv[argc]中的空指针main()。我没有阅读手册以确保这是必需的,但一致性很好。当我检查我的答案的第一版时,它没有在没有警告的情况下编译——事实上,它得到了你的警告;我已经用argvxData数组和argvx双指针解决了这个问题。原型中的[]大多是红鲱鱼,但避免被指责为三星级程序员。它相当于char ***argv

或者您可以将参数传递给 main:

    DFBCHECK(DirectFBInit(&argc, &argv));
于 2013-07-12T23:43:16.503 回答
1

如果我们称其char *为“字符串”,那么它会简化一点。该函数需要一个指向字符串数组的指针。您正在传递一个字符串,以及一个错误初始化的字符串(argx具有类型char*[],但您将其分配给类型的变量char*)。

&argxPtr实际上应该是&argx(函数预期的类型表达式char*(*[])),你根本不需要argxPtr

于 2013-07-12T23:40:18.877 回答
0

像这样的东西?

int myargc = 2;
const char *myargv[] = { "self", "--dfb:no-vt" };
DirectFBInit(&myargc, &myargv);
于 2013-07-12T23:42:47.303 回答
0

一个简单的验证方法是使用 -g 编译并运行 gdb。进入 gdb 后,运行程序,然后键入 ptype,您将看到不同之处。我已将 func 名称替换为 foo()

foo(int  *argc, char *(*argv[]))
{                               
}                               

int
main (int argc, char *argv[])
{                            
    char *argx[2] = {"self","--dfb:no-vt"};
    char *argxPtr = argx;                  

    foo (&argc, &argxPtr);
}                              

(gdb) ptype foo
type = int (int *, char ***)

(gdb) ptype main
type = int (int, char **)

因此发出警告。希望这可以帮助。

于 2013-07-13T00:16:35.800 回答