繁体   English   中英

在C ++中将char **传递给函数(const char **)

[英]passing a char ** to a function(const char **) in C++

我正在尝试使用循环数据库的函数rrd_update_r

int       rrd_update_r(const char *filename,const char *_template,
                                   int argc,const char **argv);

该函数接受众所周知的argc, argv作为第3和第4个参数。

即使我为此项目使用C ++(和g ++),rrd也是用C编写的,因此我可以使用GNY / Linux中提供的函数wordexp(char *, wordexp_t*)string的参数拆分为argv数组。

问题是wordexp_t返回char **类型的成员(如argv),这显然与rrd_update_r函数调用不兼容。

/usr/include/rrd.h:238:15: error:   initializing argument 4 of ‘int rrd_update_r(const char*, const char*, int, const char**)’ [-fpermissive]

令我惊讶的是,在这件事上我也找不到任何帮助。 为什么我不能在C语言中将'char **'转换为'const char * const *'? 解决方案不起作用。

所以我想知道:如何将char **传递给const char **?

完整功能是

#include <errno.h>   // Error number definitions
#include <rrd.h>
#include <wordexp.h>

void splitToArgs(string& parametersString) //parametersString contains space separated words (parameters). 
{
    wordexp_t we;
    int er = 0;

    if ( (er=wordexp(parametersString.c_str() , &we, 0)) != 0)
    {
        cout << "error in word expansion " <<  er << endl;
    }
    else
    {
        if (we.we_wordc>0)
        {
            char * filename = we.we_wordv[1]; //filename is part of the parameters string
            rrd_clear_error();
            int ret = rrd_update_r( filename , NULL , we.we_wordc, we.we_wordv );
            if ( ret != 0 )
            {
                cout << "rrd_update error # = " << ret << " error string = " << rrd_get_error() ;
            }
        }
    }
    wordfree(&we);
}

const_cast这种用法(如果正确)也不起作用

error: invalid conversion from ‘char**’ to ‘const char**’ [-fpermissive]
const char **w = const_cast<char**>(we.we_wordv);
 const_cast<const char**>(whatever)

在这种情况下是const_cast的正确方法。

我将给您一个将char传递给枚举的示例(实际上是一个常量)

enum TIngrediente
{
    TOMATE,
    QUESO,
    NATA,
    CEBOLLA,
    POLLO,
    HUEVO,
    SALAMI,
    ANCHOA,
    BACON,
    GAMBA
};
string tolower(string s)
{
    string r = s;
    for (int i = 0; i < s.size(); ++i)
        r[i] = tolower(r[i]);
    return r;
}

TIngrediente StrToIngrediente(string s)
{
    s=tolower(s);
    int i;

     while (i < INGREDIENTES.size() and INGREDIENTES[i] != s)
        ++i;
    return (TIngrediente)i;
}

现在,您唯一需要做的就是让另一个函数再次从const char更改为char(非常简单),这样您就可以将char常量转换为const char,要注意,您需要添加一个库,cctype和local来进行创建这项工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM