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...