作者suhorng ( )
看板C_and_CPP
標題Re: [情報] C++大師認證
時間Sat Jun 15 11:32:30 2013
作業四終於通過, 7/7前完成作業五有望 Q__Q 作業四的邊邊角角莫名的多
分享一下心得 (雖然已經晚了...)
最大的心得是, 乖乖照著 standard 寫(或design notes), 不要想什麼
比較higher level的construct...
這主要在說 '##'. 我的作法是收到 macro definition 時就去分析他的定義, 把
#, ## 這兩個部份抽離開來, 這樣每次 invocation 就不用重新分析. 事實證明這
根本自找麻煩.
http://forum.cppgm.org/question/1811 (官測沒有這種測資)
## 的規則是
1.如果接的是 parameter, 就把 parameter 的 preprocessing token
sequence 抓進來
2.上一步做完後, 把所有 ## 兩邊的 preprocessing token 接起來
所以 a ## b 這種, 若 b (parameter) 有多個 preprocessing tokens, 只有最左邊的會
被接起來! 這一定要拿到參數才會知道. 乾脆就照個標準乖乖做比較容易吧...
另一個就是 dead-macro 的 propagation. 不過唯一比較奇怪的應該是在 ##
operator 中的情況. 這也很邊角, 官測沒有, 我想可能也不太重要:
http://forum.cppgm.org/question/1812/nested-macro-after-concatenation/
簡單來說, 若 F 是 non-replaced, 那 F#
#placemarker 出來的還是 non-replaced 的 F
其他在參數中傳遞的 non-replaced 之類沒有什麼容易忽略的細節
我的寫法是對每個 pp-token 綁定一個 environment, 代表這個 pp-token 允許呼叫的
macro. 我想這個應該...跟 design notes 中的 non-replace 很像? 這個作法中, 既然
是對每個 pp-token 綁定它可以呼叫的 macros, 類似把他說的 blacklist of nested
macro names and a noninvokable flag 合併在一起了
但是這畢竟不是 static scoping, 例如當 function macro 去使用它的參數(的pp-token)
時, 必須要去修改他們的 environment 把自己從環境中移除.
也許這兩者其實會一樣, 可是我不確定, 不顯然orz. 這個作法老實說做了多餘的事,
不必要. 照 design notes 建議的應該會好很多.
anyway, macro本來就無視語言的語法, 妄想能有比較高階的寫法好像滿笨的 XDrz
其實 PA4 寫起來比想像中的短. 我的程式大概 600 行, 不過如果照著 design notes 用
比較好寫的寫法應該能短一點吧..
preprocessor真的好討厭阿..又不是語言的一部分(呃 好啦其實它是..), 任何的修改
也不依照語言的語法結構; 還有 PA5 我想不到 __LINE__ 該怎麼辦.......
話說C++11 還真多了一些小函式
例如 stoull/stoll 系列跟 to_string 系列
map/set/unordered_xxx 之類容器的 _.at(key)
//這個找不到會噴exception, 所以比 operator[]好
//也可以不用每次都 _.find() 然後 if == end 之類...
部份container的 emplace/emplace_front/emplace_end/emplace_hint
//舉例 std::list< std::pair<int,char> > mylist;
mylist.emplace_front(10,'a');
//變成不用造一個臨時物件傳進去, e.g. mylist.push_back(pair(10, 'a'));
//雖然 move 過去應該沒差..?
一些container的method也由iterator改成const_iterator XD
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.166.44.76
推 azureblaze:__LINE__我是每個token掃進來的時候都先存他的行號 06/15 16:28
→ azureblaze:然後marco replace的時候把新的token的行號設成跟head 06/15 16:29
→ azureblaze:一樣,最後每個檔案再加一個lineOffset來處理#line 06/15 16:30
推 ck574b027:借問一下我pa3可以pass local但grading不行,有人能幫 06/18 16:12
→ ck574b027:我看一下git log最近push是何時嗎?我的是May 13,感謝 06/18 16:13
推 LPH66:我的也是 May 13 你要不要看一下信裡說掛在哪裡? 06/18 16:17
→ suhorng:結果今天rejudge了耶? 06/19 21:26
→ suhorng:有變什麼嗎... 06/19 21:26
推 azureblaze:看起來好像只是測試rejudge有多花時間 06/19 22:12
→ azureblaze:有人提出改測資自動rejudge的需求 06/19 22:12
→ ck574b027:沒事我耍蠢了,沒給初值mac gcc會給0 XD 06/19 23:07
→ azureblaze:還是灌個vm吧 後面一定會用到 06/19 23:14
→ suhorng:全域變數嗎? 06/19 23:21
→ ck574b027:struct裡的某private變數,超貼心的XD 06/19 23:26
→ suhorng:竟然XD 06/19 23:29
→ suhorng:說起來我也是一直在 Windows 下用 MinGW 寫。.. 06/19 23:29
→ suhorng:PA5過了!! 感謝azureblaze大 06/20 09:36
推 bunjie:好像很有趣的感覺 06/20 11:21