Re: [情報] C++大師認證
作業四終於通過, 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
推
06/15 16:28, , 1F
06/15 16:28, 1F
→
06/15 16:29, , 2F
06/15 16:29, 2F
→
06/15 16:30, , 3F
06/15 16:30, 3F
推
06/18 16:12, , 4F
06/18 16:12, 4F
→
06/18 16:13, , 5F
06/18 16:13, 5F
推
06/18 16:17, , 6F
06/18 16:17, 6F
→
06/19 21:26, , 7F
06/19 21:26, 7F
→
06/19 21:26, , 8F
06/19 21:26, 8F
推
06/19 22:12, , 9F
06/19 22:12, 9F
→
06/19 22:12, , 10F
06/19 22:12, 10F
→
06/19 23:07, , 11F
06/19 23:07, 11F
→
06/19 23:14, , 12F
06/19 23:14, 12F
→
06/19 23:21, , 13F
06/19 23:21, 13F
→
06/19 23:26, , 14F
06/19 23:26, 14F
→
06/19 23:29, , 15F
06/19 23:29, 15F
→
06/19 23:29, , 16F
06/19 23:29, 16F
→
06/20 09:36, , 17F
06/20 09:36, 17F
推
06/20 11:21, , 18F
06/20 11:21, 18F
討論串 (同標題文章)
完整討論串 (本文為第 28 之 29 篇):
情報
4
12
情報
5
18
情報
11
21
情報
3
9
情報
11
27
情報
0
1
情報
6
19
情報
7
24
情報
2
2
情報
3
5