从const char指针到char指针的赋值不给出警告

时间:2019-06-17 16:42:43

标签: c pointers char const

下面的代码为什么不发出警告?

与-Wall,-Wpedantic,-Wextra一起编译,并且没有一个发出警告。

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

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

3 个答案:

答案 0 :(得分:6)

您正在将{em>从{em1}分配到{em}到char *。这是安全的,因为您添加了const char *限定词,而不是将其删除。

如果您这样做:

const

然后,您会收到有关丢弃char *p; const char a[] = "hey"; p = a; 限定符的警告。

答案 1 :(得分: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. 很难(但并非不可能)更改您不应该在函数中错误更改的内容。

答案 2 :(得分:0)

 assignment from const char pointer to char pointer gives no warnings

您的示例做了相反的事情。您将指针分配给常量对象,将指针分配给非常量对象。这样您就不会丢弃任何东西,因此不会磨损