下面的代码为什么不发出警告?
与-Wall,-Wpedantic,-Wextra一起编译,并且没有一个发出警告。
int main()
{
const char *p;
char a[] = "hey";
p = a;
(void) p;
return 0;
}
我希望收到某种警告,例如-Wdiscarded-qualifiers
答案 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的指针有两件事:
它告诉使用该函数的程序员该函数将不会使用该参数作为输出参数,除非该函数的作者是邪恶的或不知道他在做什么。
很难(但并非不可能)更改您不应该在函数中错误更改的内容。
答案 2 :(得分:0)
assignment from const char pointer to char pointer gives no warnings
您的示例做了相反的事情。您将指针分配给常量对象,将指针分配给非常量对象。这样您就不会丢弃任何东西,因此不会磨损