【问题标题】:assignment from const char pointer to char pointer gives no warnings从 const char 指针到 char 指针的赋值不给出警告
【发布时间】:2019-10-31 07:12:07
【问题描述】:

为什么下面的代码没有引发警告?

使用 -Wall、-Wpedantic、-Wextra 编译,它们都不会引发警告。

int main()
{
    const char *p;
    char a[] = "hey";
    p = a;
    (void) p;
    return 0;
}

我希望得到某种警告,例如 assignment -Wdiscarded-qualifiers

【问题讨论】:

  • 提示:content 是常量还是指针本身?
  • 您认为哪一行有问题?
  • 你认为哪个限定词被丢弃了,在哪里被丢弃?
  • a"hey" 中的字符初始化。 a 然后是完全可变的。在p = a 中没有忽略const。您只是无法将a 更改为p(void)p; 只是为了抑制 p-Wunused 警告(因为它被分配了一个值但从未使用过)。

标签: c pointers char constants


【解决方案1】:

你没有放弃一个限定词。您正在添加一个。这个功能实际上非常重要。这是 C 语言实际上为程序员提供了一个合理的选择来保护自己免受伤害的少数情况之一。例如,看看标准库中字符串操作函数的原型:

char * strcpy ( char * destination, const char * source );

这告诉我们destination 将被更改,但source 不会。

来自下面的评论:

是否还要求目标参数不能是 const char *

有一些方法可以解决它,所以它本身不是必需的。毕竟我们在谈论C。但是,如果您打算将参数用作输出参数,则不应将其声明为const。这是我使用const 参数作为输出参数的示例。这是一个将字符串长度设置为零的函数:

// Note: Bad code. Do not do this at home. Ok, do it at home,
// but do not do it at work.
void removeString(const char * s)
{
    char *p = (char*) s;
    p[0] = 0;
}

但是为了做到这一点,你首先必须声明一个指向 s 的非常量指针,然后你必须添加转换 (char*) 以消除警告。这很容易做到,但很难做到,所以它起到了很好的保护作用。

将参数声明为指向 const 的指针有两个好处:

  1. 它告诉使用函数的程序员,函数不会使用参数作为输出参数,除非函数的作者是邪恶的或者不知道他在做什么。

    李>
  2. 在函数中更改不应该更改的内容变得更加困难(但并非不可能)。

【讨论】:

  • 是否还要求destination参数不能是const char *
  • @PaulOgilvie 如果你想写一个对象,你为什么要把它声明为 const?
  • (抱歉我反应迟了),我的意思是如果你尝试为destination 传递一个常量对象,编译器会抱怨吗?这一切都是为了帮助程序员防止出错。
  • @PaulOgilvie 抱歉,我只能这么说。当你尝试时发生了什么? ;)
  • 我没有尝试过,但会发现这些信息对您的解决方案很有价值。
【解决方案2】:
 assignment from const char pointer to char pointer gives no warnings

你的例子做了相反的事情。您使用指向非常量对象的指针分配指向常量对象的指针。因此,您不会丢弃任何东西,因此不会磨损

【讨论】:

    【解决方案3】:

    您正在分配 来自 char * const char *。这是安全的,因为您添加了 const 限定符,而不是删除它。

    如果你这样做了:

    char *p;
    const char a[] = "hey";
    p = a;
    

    然后您会收到有关丢弃 const 限定符的警告。

    【讨论】:

      猜你喜欢
      • 2011-12-05
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 2016-06-23
      • 2013-05-15
      • 2016-06-10
      • 1970-01-01
      • 2022-11-20
      相关资源
      最近更新 更多