当一个函数可以被赋予一个 char* 或文字字符串时,声明这个函数的正确方法是什么?

When a function is possible to be given a char* or literal string, what is the right way to declare this function?

本文关键字:函数 一个 声明 是什么 方法 char 文字 字符串      更新时间:2023-10-16

这个问题不是问题:弃用从字符串文字到字符的转换

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

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

我还在警告弃用从字符串常量到"char"的转换中找到了一些解决方案

  1. 结构
  2. -
  3. Wno-write-string

我的进一步问题是:

  1. 如何在 Xcode 中设置 -Wno-write-string?或者 Clang 中真的有这样的标志,就像在 gcc/g++ 中一样?我没有在叮当旗参考中找到它

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

您只需将函数的输入参数设为const char*即可,它就可以工作。输入参数为 const char* 的函数意味着该函数不会更改指针指向的内容!因此,这意味着它将同时使用字符串文字(它们本身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*参数不允许这样做!

相关文章: