下面的程序由於未定義行爲引發系統性分段錯誤(試圖修改字符串文字):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