在 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);
该函数接受众所周知的第 3 个和第 4 个参数 argc, argv
。
尽管我在该项目中使用 C++(和 g++),但 rrd 是用 C 编写的,因此我可以使用 GNY/Linux 中提供的函数 wordexp(char *, wordexp_t*)
来拆分 string
到 argv
数组。
问题是 wordexp_t returns 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);
我将给您举一个将 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 才能完成这项工作。
const_cast<const char**>(whatever)
在这种情况下, 是 const_cast 的正确方法。
我正在尝试使用循环数据库的功能rrd_update_r
。
int rrd_update_r(const char *filename,const char *_template,
int argc,const char **argv);
该函数接受众所周知的第 3 个和第 4 个参数 argc, argv
。
尽管我在该项目中使用 C++(和 g++),但 rrd 是用 C 编写的,因此我可以使用 GNY/Linux 中提供的函数 wordexp(char *, wordexp_t*)
来拆分 string
到 argv
数组。
问题是 wordexp_t returns 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);
我将给您举一个将 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 才能完成这项工作。
const_cast<const char**>(whatever)
在这种情况下,是 const_cast 的正确方法。