![](/img/trans.png)
[英]How can I portably call a C++ function that takes a char** on some platforms and a const char** on others?
[英]How to supply a 'const char*' argument for a function that takes a 'char*' in C++?
我有以下代码。
const char* my_input = "my string";
void my_function(char* my_argument);
int main()
{
my_function(my_input);
}
void my_function(char* my_argument)
{
/* Do something */
}
请注意,my_function的参数需要'char *',但我提供了'const char *'。
我的IDE给了我错误:没有匹配函数调用'my_function'。
我假设这是因为函数调用被解释为'my_function(const char * my_argument)',我显然没有定义(并且不想)。
我怎样才能使我的常量输入对预期的非常量参数有效?
在我的真实程序中,我有一个函数,它接受一个'char *',但它不会修改它。 参数本身可能不是常数(通常也不常),但有时候我会期望一个常数。
在这里,最稳定的解决方案是使您的输入成为char*
而不是const char*
:
char my_input[] = "my string";
但是,如果你不能,另一个解决方案是使用const_cast
在参数上“重新保证”你的IDE:
int main()
{
my_function(const_cast<char*>(my_input));
}
但是要小心这种技巧:如果你的变量是只读的,你的函数my_function
试着修改它,那就准备好了分段错误。
你可以这样做,如果你确定你的C函数不会尝试做任何事情而是读取指针的数据,即使参数不是const
,因为它有时在C库中发生。
否则,你必须找到一种传递可修改参数的方法。
如果你的数据是const
,那么更复杂但更安全的方法是将你的原始指针复制到一个新的指针中,可以修改一个:
int main()
{
char* copy = strdup(my_input); // Or a static buffer if you know precisely your input size
my_function(copy);
free(copy);
}
它不被解释为my_function(const char *)
调用。 它被解释为my_function(char *)
调用,因为my_function
没有其他版本可用。 但是,这是不允许的,因为它违反了C ++语言的const-correctness规则。 这些规则禁止将const char *
指针隐式转换为char *
类型。
你必须在这里回答的第一个问题是为什么你试图将指向常量数据的指针传递给一个可能将其视为非常数 (可修改)数据的函数。 这显然违反了const-correctness。
如果你的my_function
没有真正修改数据,那么下一个问题就是为什么用char *
参数而不是const char *
参数声明它。
并且只作为最后的手段,如果您确定my_function
没有真正修改数据,但由于某种原因无法更改其声明(例如第三方代码),您可以通过强制转换为char *
类型来解决此问题
my_function(const_cast<char *>(my_input));
你可以使用const_cast
:
my_function(const_cast<char*>(my_input));
但是,这很危险,因为如果my_function
修改my_argument
,则它是未定义的行为。
如您所知,const变量无法修改,因此您无法将其传递给可能更改其值的函数。
如果需要传递该变量的值,那么最好的方法是创建一个可写的非const副本。
char my_copy[strlen(my_input) + 1];
strcpy(my_copy, my_input);
my_function(my_copy);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.