【问题标题】:Ambiguity with const keyword in CC 中 const 关键字的歧义
【发布时间】:2020-10-10 02:05:10
【问题描述】:

我有一些代码:

int main() {
    const char *string1 = "foo";
    char *string2 = "bar";

    string1 = string2;

    return 0;
}

当我构建它时,不会发出任何警告。然而,随着

int main() {
    const char *string1 = "foo";
    char *string2 = "bar";

    string2 = string1;

    return 0;
}

发出警告:

warning: assignment discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
     string2 = string1;
             ^

以我目前的 C 基础知识,我会认为 string1 不会被重新分配,因为它是 const。令我惊讶的是,第一个 sn-p 中的代码构建时没有任何警告,而第二个代码 sn-p 则相反。

对发生的事情有任何解释吗?谢谢!

【问题讨论】:

  • 查看为:(const char)* string1 = ..。注意警告“..from pointer target type..”。

标签: c string constants


【解决方案1】:

这完全没问题。这里的(潜在)问题是您指向的字符串是字符串文字,因此修改它们会引发未定义的行为。

你把它混在一起的可能是这样的:

  • const char *str1 - str1 是指向 const char 的指针
  • char * const str2 - str2 是一个指向 char 的 const 指针
  • const char * const str3 - str3 是一个指向 const char 的 const 指针

str1 可以重新分配以指向其他对象,但由于它是指向const char 的指针,它不能用作左值,因此禁止使用*str1 = <something>。另一方面,str2 不能重新分配以指向其他东西,但它可以用作左值。使用str3,您不能做任何这些。

另外,请注意const char *strchar const *str 是等价的。要了解声明的作用,或了解如何声明某些内容,请使用此站点:https://cdecl.org/

【讨论】:

    【解决方案2】:

    我原以为 string1 不会被重新分配,因为它是 const。

    但事实并非如此!

    它是一个非const 指针,指向const 事物(具体来说,const chars)。

    你的代码很麻烦的唯一原因是你不应该将const char*隐式转换为char*,原因很明显——它会破坏const-safety的目的,只删除const任何时候你喜欢的指针类型!这就是您收到警告的原因。

    反过来,添加 constness,就像你的第一个例子一样,很好。

    tl;博士:这不是你的任务;这是你分配的。

    【讨论】:

    • 将 const 指针转换为非 const 指针完全没问题。
    • @klutt 我没说不是。我们谈论的是 pointee 类型。问题本身表明这不起作用,我的回答说明了原因。
    • (好吧,FSVO“不起作用”……看来这只是对 C 编译器的警告。这是 C++ 中的一个硬错误。这绝对是个坏主意。)跨度>
    • 该问题表明它会发出警告。并不是说它不起作用。你对指针是什么意思?指针指向类型为非常量的字符串字面量。
    • 是的,C++ 在强制转换方面的规则与 C 完全不同,所以很遗憾,这个答案是完全错误的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多