下面的程序由于未定义行为引发系统性分段错误(试图修改字符串文字):C编译器为什么不提示与字符串不兼容的类型?
int main() {
char *s = "immutable";
s[0] = 'a';
return 0;
}
不过,似乎是绝对没有办法告诉GCC/Clang的发出哪怕是一丁点的警告有关它(-Wall -Wextra -pedantic -std=c11
不做任何事)。
尤其对于初学者来说,这种情况对于通知有用。即使对于非初学者来说,在一些稍微不太明显的情况下,它可能会有所帮助:
void f(char *s) {
s[0] = '0';
}
int main() {
char *s = "immutable";
f("literal"); // oops
f(s); // oops
return 0;
}
此外,这将有助于加强在C编程一些const
- 文化。
为什么这种情况被故意忽略?标准是否积极地禁止在这种情况下发布诊断信息,或者主要是为了向后兼容(现在试图强制执行它们会产生太多警告)?
它不是默认的,因为遗憾的是还有一堆以非常量正确方式编写的遗留代码。有些甚至早于C中增加了'const'。 – StoryTeller
默认情况下启用这种警告会导致警报疲劳。如果编译器对此提出警告会很高兴,但是仍然有太多的旧代码会在此代码中跳动,而仍然是正确的代码。 – Art