【问题标题】:When a function is possible to be given a char* or literal string, what is the right way to declare this function?当一个函数可以被赋予一个 char* 或文字字符串时,声明这个函数的正确方法是什么?
【发布时间】:2014-01-08 07:13:48
【问题描述】:

这个问题不是问题的重复:deprecated-conversion-from-string-literal-to-char

但是,是的,我正试图摆脱这个烦人的 Clang 警告。在那个答案中有以下几种方式:

  1. const_cast 或 (char*)
  2. foo(char*) -> foo(const char*)

我也在warning-deprecated-conversion-from-string-constant-to-'char'找到了一些解决方案

  1. strcpy
  2. -Wno-write-string

我的另一个问题是:

  1. 如何在 Xcode 中设置 -Wno-write-string?或者实际上在 Clang 中是否有这样的标志,就像在 gcc/g++ 中一样?我在Clang Flag Ref没有找到它

  2. 在我的代码中,我得到了定义为 foo(char*) 的函数,它们在一段时间内接收字符串或 char*,并在其他时间接收文字字符串(例如“hello”)。对于这种情况,decl/def foo 的正确方法是什么?

【问题讨论】:

  • 简单,取参数为const char*。并且无法想象你为什么会有第二个想法。
  • @jrok 为什么不const std::string&
  • 如果您的函数将字符串文字作为可能的参数,这意味着它不会更改它自己的字符串。所以把它当作const char* 是有道理的。
  • @jrok sry 但你错过了重点,有一段时间给定的参数是 char*,其他时候它是文字的。如果我只是简单地更改为const char*,那么char*的现有数十个使用呢
  • @rozina 我不得不承认我得到的原始代码在这个功能上存在一些设计问题。它可以同时采用字符​​串文字和 char* 作为可能的参数

标签: c++ xcode clang string-literals gcc-warning


【解决方案1】:

您只需将函数的输入参数设为const char* 即可。输入参数为const char* 的函数意味着该函数不会更改指针指向的内容!所以这意味着它可以同时使用字符串 literlas(它们本身是 const char*)和常规的 char* 参数。

void printString(const char* str)
{
    printf("%s", str);
}

这个函数可以这样调用:

int main()
{
    const char* pointerToLiteral = "string";
    char* str = new char[16];
    std::strcpy(str, pointerToLiteral );

    printString("true literal");
    printString(pointerToLiteral );
    printString(str);

    delete [] str;
}

当您将一个指针传递给printString 函数时,它会在其堆栈上制作该指针的副本。该副本现在的类型为const char*。这意味着printString 的代码不能改变指针指向的内容。如果您将 char* 类型的指针传递给它,这没有理由不起作用。

请注意,反过来是行不通的。如果我们有printString(char* str),则不能传递const char* 参数,因为现在函数说它也可以更改指针指向的内容,但const char* 参数不允许这样做!

【讨论】:

  • 'literal' 不是文字,"literal" 是
  • 感谢您的回答。一个新案例出现:class foo{ foo(const char*); char* ptr;}Foo(const char* ch){ ptr = ch }。这会发出警告
  • 也换会员 :) class foo{ foo(const char*); const char* ptr;};
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多