S6 當心C 編譯器最煩人的分析機制

2021-09-08 14:20:34 字數 1268 閱讀 2448

1、考慮乙個包含int的檔案,複製到list,如下:

ifstream datafile("ints.bat");

listdata(istream_iterator(datafile),istream_iterator());

2、上面的**不是預期的行為。

3、先從最簡單開始,宣告方法 int f(double d); 等價的寫法有 int f (double (d)); int f (double);

也就是說,形參名稱可以使用括號括起來,形參名稱也可以省略,只保留形參的型別。

4、考慮int g(double (*pf) ()); 形參是乙個方法指標,等價的寫法有 int g(double pf ()); 我們省略形參名稱,就變成了 int g(double ());

5、現在考慮listdata(istream_iterator(datafile),istream_iterator()); c++編譯器會認為這個乙個方法宣告,第乙個形參是:形參型別是istream_iterator,形參名稱是 datafile,只不過使用括號括起來了,第二個形參是:形參型別是乙個方法指標,指向的方法是返回istream_iterator,接受形參void,省略了形參名稱。

6、c++中有一條規律,語句優先解釋成 方法宣告。當這個解釋失敗,才進行其他解釋。最常見的如下:

student s; // ok

print(s);

student s = student(); // ok

print(s);

print(student()); // ok

student* s = new student(); // ok

print(*s);

student* s = new student; // ok

print(*s);

student s(); // error

print(s);

因為c++會把student s();當成乙個方法宣告。

7、怎麼解決上面的問題?

兩種辦法:辦法一,對於方法呼叫,實參可以使用括號括起來,而對於方法宣告,把整個形參(包括形參型別和形參名稱)括起來是錯誤的,因此可以如下:

listdata( (istream_iterator(datafile) ),istream_iterator());

辦法二:不使用匿名物件,使用具名物件,如下:

istream_iteratorbegin(datafile);

istream_iteratorend;

listdata(begin,end);

條目六《當心C 編譯器中最煩人的分析機制》

c 是較為底層的面相物件語言,在底層的語法規則分析中,有很多隱藏的分析機制。c 中的普遍規律相符,即盡可能地解釋為函式宣告。把形式引數的宣告用括號括起來是非法的,但給函式引數加上括號卻是合法的,所以通過增加一對括號,我們強迫編譯器按我們的方式來工作。例如 這樣是不正確的,因為形參含有括號 爭取做法 ...

C語言編譯器哪個好 6款好用的C語言編譯器推薦

其實win tc是款很不錯的軟體。去用一下你就知道了,因為我自學c時就是用的那個軟體,真的向你推薦它!推薦使用vc 6.0中文版,因為國家考試用的就是那個,當然了還有turbo c這個也是以前國家考試用的,但是這些版本很老了,而且沒有現在的方便,比如你遇到了問題想去諮詢下別人,老版本的尤其是比較經典...

LCC編譯器的源程式分析 1 C編譯器的目標

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!先從簡單的目標來分析這個大規模的 c 編譯器,畢竟它的功能比較複雜,並且源程式的行數也是非常多的。因此,把簡單的目標定出來,然後再分析它,這樣才會有的放矢。接著再跟著編譯執行的主線來分析它的源程式。下面先看一下簡單的 c 例子,如下 001 inc...