【问题标题】:passing a char ** to a function(const char **) in C++将 char ** 传递给 C++ 中的函数(const char **)
【发布时间】:2015-12-20 16:54:48
【问题描述】:

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

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

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

尽管我在这个项目中使用 C++(和 g++),但 rrd 是用 C 编写的,因此我可以使用 GNY/Linux 中提供的函数 wordexp(char *, wordexp_t*)string 的参数拆分为 @987654327 @数组。

问题是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]

令我惊讶的是,我在这件事上也找不到任何帮助。这个Why can't I convert 'char**' to a 'const char* const*' in C? 解决方案不起作用。

所以我想知道:如何将 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);

【问题讨论】:

  • @n.m.如何?请看我的编辑
  • const_cast&lt;const char**&gt;(
  • @n.m.是的,你真的看过我的编辑吗?你写的就是我写的,行不通。如果您的意思有所不同,则必须更明确一些
  • 再看一遍。这不是你写的。
  • 确实有效。谢谢!您可以将此添加为答案吗?这是有道理的。

标签: c++ constants argv rrd


【解决方案1】:
 const_cast<const char**>(whatever)

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

【讨论】:

    【解决方案2】:

    我会给你一个例子,将一个字符传递给一个枚举(实际上是一个常量)

    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 来完成这项工作。

    【讨论】:

    • 很抱歉,但这远不是我需要的。
    • 这并不能以任何方式回答问题
    • 这是零意义。
    猜你喜欢
    • 1970-01-01
    • 2013-11-20
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 2012-07-26
    • 2013-09-29
    相关资源
    最近更新 更多