2016-03-26 51 views
2

我有以下代码。如何为在C++中使用'char *'的函数提供'const char *'参数?

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

看起来我们在这里有一个匿名的答案 - downvoting机器人 –

+0

函数是否试图修改数据?这是你必须回答的第一个问题。 – AnT

+0

@AnT - 不,我无意修改这个论点。 –

回答

4

它不被解释为my_function(const char *)调用。它被解释为my_function(char *)呼叫,因为在任何地方都没有其他版本的my_function。但是,这是不允许的,因为它违反了C++语言的常量正确性规则。这些规则禁止将const char *指针隐式转换为char *类型。

你要在这里回答的第一个问题是,为什么你想一个指针传递给不断数据潜在把它当作非恒定(修改)数据的功能。这明显违反了const正确性。

如果你的my_function没有真正修改数据,那么接下来的问题是为什么它用char *参数而不是const char *参数声明。

只有作为最后手段,如果您确定my_function并未真正修改数据,但出于某种原因无法更改其声明(例如第三方代码),则可以通过强制转换为char *

my_function(const_cast<char *>(my_input)); 
+0

因此,在我的真实程序中,我有一个'const char * empty_string =“”;'。有时我想用它作为论据。这是否违反const正确性?如果是这样,我该如何解决它的意图? –

+0

@Sir Jony:你的'empty_string'是一个指向字符串的指针。字符串文字是不可变的。如果你将它作为'char *'传递给一个修改函数,这不仅会违反const正确性,你的程序实际上会崩溃并烧毁。你没有提供有关情况的重要细节,这就是为什么不可能给你一个具体的答案。 – AnT

+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); 
} 
+0

有没有“黑客”的解决方案,并可能引入更多的问题? –

+1

@SirJony它不是“黑客”。 C++编译器可以防止你做一些基本的愚​​蠢的事情,并且覆盖它你必须是冗长的。 –

+0

@AntonSavin,好的。只要它不是运行时问题,我很好。我只是担心编译器不会警告我。但如果是这样的话,我想这很好。 –

0

您可以使用const_cast

my_function(const_cast<char*>(my_input)); 

但是,这是危险的,因为如果my_function修改my_argument,这是未定义的行为。

0

如你所知,一个const变量不能被修改,所以你不能把它传递给可以改变其值的函数。

如果您需要传递该变量的值,那么最好的方法是创建一个可写的非const拷贝。

char my_copy[strlen(my_input) + 1]; 
strcpy(my_copy, my_input); 
my_function(my_copy); 
相关问题