看板 C_and_CPP 關於我們 聯絡資訊
作業四終於通過, 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