Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何提供';常量字符*';采用';字符*';在C++;?_C++_Function_Arguments_Constants - Fatal编程技术网

C++ 如何提供';常量字符*';采用';字符*';在C++;?

C++ 如何提供';常量字符*';采用';字符*';在C++;?,c++,function,arguments,constants,C++,Function,Arguments,Constants,我有以下代码 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 */ } 请注意,我的_函数的参数需要一个“char*”,但我为它提供了一个“const char*” 我的IDE给了我一个错误:调用“我的

我有以下代码

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 */
}
请注意,我的_函数的参数需要一个“char*”,但我为它提供了一个“const char*”

我的IDE给了我一个错误:调用“我的函数”没有匹配的函数

我假设这是因为函数调用被解释为“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));
}

您可以使用
const\u cast

my_function(const_cast<char*>(my_input));
my_函数(const_cast(my_输入));

但是,这是危险的,因为如果
myu函数
修改
myu参数
,这是未定义的行为。

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

这里必须回答的第一个问题是,为什么要尝试将指向常量数据的指针传递给可能将其视为非常量(可修改)数据的函数。这显然违反了常量的正确性

如果您的
my\u函数
没有真正修改数据,那么下一个问题是为什么用
char*
参数而不是
const char*
参数声明它

只有在万不得已的情况下,如果您确信
my_函数
没有真正修改数据,但由于某些原因无法更改其声明(例如第三方代码),您可以通过强制转换为
char*
类型来解决此问题

my_function(const_cast<char *>(my_input));
my_函数(const_cast(my_输入));

如您所知,常量变量无法修改,因此您无法将其传递给可能更改其值的函数

如果需要传递该变量的值,那么最好的方法是创建一个可写的非常量副本

char my_copy[strlen(my_input) + 1];
strcpy(my_copy, my_input);
my_function(my_copy);

有没有一种解决方案不需要“黑客”并且可能会带来更多的问题?@SirJony这不是“黑客”。C++编译器阻止你做一些基本的愚蠢的事情,并且要重写它,你必须冗长。只要不是运行时的问题,我就没事。我只是担心编译器不会警告我。但是如果是这样的话,我想没问题。看起来我们这里有一个匿名答案下表决机器人,它试图修改数据吗?这是你必须回答的第一个问题。@AnT--不,我无意修改参数。@M.M--你是什么意思?@SirJony我检查了几行问题,所有答案(或除一个以外的所有答案)都被删除了。因此,在我的实际程序中,我有一个“const char*empty_string=”“;”。有时我想用它作为论点。这是否违反常量正确性?如果是这样的话,我该如何用同样的意图来修复它?@Sir Jony:Your
empty_string
是一个指向字符串文本的指针。字符串文本是不可变的。如果将其作为
char*
传递给修改函数,不仅会违反const正确性,还会导致程序崩溃和烧毁。您没有提供有关情况的重要细节,这就是为什么无法给您一个具体的答案。@Sir Jony:如果您不修改函数中的数据(如您在问题的最后一部分所述),那么,正如我前面所述,您只需使用
const char*
参数声明函数即可。谢谢!我想我已经解决了这个问题,但现在我有一个链接问题需要解决(可能不是因为您的解决方案)描述得很好的回答。我刚学会了今天的新想法
char my_copy[strlen(my_input) + 1];
strcpy(my_copy, my_input);
my_function(my_copy);