【问题标题】:How to supply a 'const char*' argument for a function that takes a 'char*' in C++?如何为在 C++ 中采用“char*”的函数提供“const char*”参数?
【发布时间】:2016-07-13 20:15:47
【问题描述】:

我有以下代码。

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*”的函数,但它不会修改它。参数本身可能不是一个常数(通常也不是),但有时我希望是一个常数。

【问题讨论】:

  • 看起来我们这里又出现了一个匿名回答-downvoting 机器人
  • 函数是否尝试修改数据?这是您必须回答的第一个问题。
  • @AnT -- 不,我无意修改参数。
  • @M.M -- 你是什么意思?
  • @SirJony 我连续检查了几个问题,所有答案(或除一个以外的所有答案)都被否决了

标签: c++ function arguments constants


【解决方案1】:

在这里,最稳定的解决方案是将您的输入设为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);
}

【讨论】:

  • 有没有没有“黑客攻击”并且可能引入更多问题的解决方案?
  • @SirJony 这不是“黑客”。 C++ 编译器会阻止你做一些基本的愚​​蠢的事情,并且要覆盖它,你必须是冗长的。
  • @AntonSavin,好的。只要不是运行时问题,我就没事。我只是担心编译器不会警告我。但如果是这样,我想没关系。
【解决方案2】:

你可以使用const_cast:

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

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

【讨论】:

    【解决方案3】:

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

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

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

    并且仅作为最后的手段,如果您确定my_function 没有真正修改数据,但由于某种原因无法更改其声明(例如第三方代码),您可以通过强制转换来解决此问题转至char * 类型

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

    【讨论】:

    • 所以,在我的真实程序中,我有一个 'const char* empty_string = "";'。有时我想用它作为论据。这是否违反了 const 正确性?如果是这样,我该如何以相同的意图修复它?
    • @Sir Jony:您的 empty_string 是一个指向字符串文字的指针。字符串文字是不可变的。如果你将它作为char * 传递给一个修改函数,这不仅会违反 const 正确性,而且你的程序实际上会崩溃和烧毁。您没有提供有关情况的重要细节,这就是为什么无法给您具体答案的原因。
    • @Sir Jony:如果你不修改函数中的数据(正如你在问题的最后一部分中所说的那样),那么,正如我上面所说,你应该简单地用 @ 声明你的函数987654334@参数。
    • 谢谢!我想我已经解决了这个问题,但现在我有一个链接问题要解决(可能不是你的解决方案的结果)。 :)
    • 一个描述得很好的答案。我刚刚了解了当天的新想法 +1
    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-19
      • 1970-01-01
      • 1970-01-01
      • 2013-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多