為什么 “auto a = 1;” 在C語(yǔ)言中可以編譯通過(guò)?
問(wèn)題(來(lái)自lee77):
- int main(void)
- {
- auto a = 1;
- return 0;
- }
把如上所示的代碼寫(xiě)在擴(kuò)展名為.c的文件里面,用MS Visual Studio 2012編譯器編譯的時(shí)候不會(huì)報(bào)錯(cuò)。我一直認(rèn)為,當(dāng)你使用.c的擴(kuò)展名時(shí),編譯器會(huì)按照C語(yǔ)言的語(yǔ)法來(lái)進(jìn)行編譯,而不是C++。而且,據(jù)我所知,不顯示定義類(lèi)型的auto變量聲明只有從C++11標(biāo)準(zhǔn)之后才被允許,在C++11中auto的含義是聲明該變量的類(lèi)型可以被初始化法式推導(dǎo)出來(lái)的。
這是不是意味著我的編譯器不嚴(yán)格遵守C語(yǔ)言的標(biāo)準(zhǔn),或者這段代碼實(shí)際上在C語(yǔ)言中是正確的?
***答案(來(lái)自larsmans):
auto 是一個(gè)古老的C語(yǔ)言關(guān)鍵字,它的代表含義是 “局部作用域”。 `auto a` 等價(jià)于 `auto int a`,而且函數(shù)里的變量定義默認(rèn)就是局部作用域的變量,所以在該例子中它也等價(jià)于`int a`.
這個(gè)關(guān)鍵字(auto)事實(shí)上是 C語(yǔ)言的前身——B語(yǔ)言 遺留下來(lái)的,B語(yǔ)言沒(méi)有基本類(lèi)型: 一切類(lèi)型都是 int, pointer to int, array of int . (*) 這些類(lèi)型的聲明只能是 `auto` 或者 `extern`。C語(yǔ)言繼承了 “任何類(lèi)型是int” 作為默認(rèn)法則,所以你能用如下方法聲明整型:
- auto a;
- extern b;
- static c;
ISO C標(biāo)準(zhǔn) 拋棄了這個(gè)法則,但是當(dāng)然有一些編譯器為了向后兼容而接受這個(gè)法則。如果你還是覺(jué)得陌生,你應(yīng)該明白有一個(gè)類(lèi)似的的法則在下面語(yǔ)句中也生效:
- unsigned d; // actually unsigned int
上式的代碼在現(xiàn)代的代碼中是很常見(jiàn)的。
C++11 復(fù)用了這個(gè)關(guān)鍵字(auto),既然它的原始含義很少被C++程序員使用,所以在C++11中被復(fù)用來(lái)作為類(lèi)型推導(dǎo)。 這樣的做法通常是安全的,因?yàn)?rdquo;一切類(lèi)型都是int”這個(gè)C語(yǔ)言的法則已經(jīng)被C++98標(biāo)準(zhǔn)中被拋棄; 唯一可能不安全的用法是 `auto T a`, 不過(guò)也沒(méi)人會(huì)這么做。()
(*) 在B語(yǔ)言中的字符串處理很有意思: 你會(huì)使用int數(shù)組和包裝多個(gè)字符在int數(shù)組的每個(gè)成員里。B語(yǔ)言事實(shí)上就是不同語(yǔ)法的BCPL(BCPL的變種)。
原文鏈接: stackoverflow 翻譯: 伯樂(lè)在線 - aszxqw