我有以下代码。
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 *'但它不会修改它。论证本身可能不是一个常数(并且通常不是),但有时我期望一个常数。
答案 0 :(得分:4)
此处,最安全的解决方案是让您的输入为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);
}
答案 1 :(得分:4)
它不会被解释为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));
答案 2 :(得分:0)
您可以使用const_cast
:
my_function(const_cast<char*>(my_input));
但是,这很危险,因为如果my_function
修改了my_argument
,那么它就是未定义的行为。
答案 3 :(得分:0)
如您所知,const变量无法修改,因此您无法将其传递给可能更改其值的函数。
如果需要传递该变量的值,那么最好的方法是创建一个可写的非常量副本。
char my_copy[strlen(my_input) + 1];
strcpy(my_copy, my_input);
my_function(my_copy);