Re: [問題] 請問if判斷式裡是否可以用macro做condition

看板C_and_CPP作者 (noOneKnows)時間10年前 (2013/08/19 20:54), 編輯推噓1(108)
留言9則, 4人參與, 最新討論串3/3 (看更多)
可以多行的 int a = 0; #define M0(b) ((\ [&](const int t)->bool {\ a += t;\ a += t;\ a -= t;\ return a > 5;\ })(b)) #define M1(b) (a+=(b), a+=(b), a-=(b), a>5) 跟普通的 function 相比,在使用上這兩種各自有些優缺點: ************* M0 (lambda 的寫法) 優點 0 : 可以避免普通函數還要給他名字。 缺點 0 : 通常只有工作才會覺得這個很好,而且這真的見仁見智。 有的人會說,M0 還不是一個名字,但其實這真的很不一樣。 優點 1: 可能可以使用外面的變數(但有限制,不過至少可以選擇傳值), 而不用像普通函數需要使用者自己傳進來, 這在跟很多人一起開發防止別人寫錯非常好用。 或當要改寫舊的程式碼 or 加入新功能卻不想重新教育使用者時 缺點 1: 這個變數必須要有定義。 ************* 至於 M1 (逗號 operator): 好處:簡單,可以使用外面變數(沒限制,因為只是文字替代)。 壞處:簡單,能做的事少也很難避免傳入的式子被重複求值。 附註: inline function 建議編譯器展開的函數,可能有以下效果: 0. inline 建議被忽略 1. 減少函數呼叫成本 2. 因為 inline 太多而增加程式碼大小 一般寫在 header file 居多,這樣可以有相同實現。 其實我也是新手,一起討論。

08/19 22:42, , 1F
壞處:會亂搞外面變數 用錯的時候會變超難解的bug
08/19 22:42, 1F

08/19 22:43, , 2F
個人用marco只是為了# ##或其他明顯是文字取代的東西
08/19 22:43, 2F
還有 @

08/19 22:44, , 3F
在c++裡把marco當function基本上是很糟的用法
08/19 22:44, 3F

08/19 23:46, , 4F
define根本不想用,搞得亂七八糟,compiler抱怨
08/19 23:46, 4F

08/19 23:46, , 5F
還看不出東西來...
08/19 23:46, 5F

08/20 07:18, , 6F
老實講除非像google test framework那種需要靠macro
08/20 07:18, 6F

08/20 07:18, , 7F
來定義結構的,其實大多數macro都不太必要... in C++
08/20 07:18, 7F

08/20 07:19, , 8F
C的話迫於無奈倒是沒什麼好說的 XD
08/20 07:19, 8F

08/20 21:20, , 9F
謝謝你,真高手,你的回答讓我受益良多
08/20 21:20, 9F
welcome~~對了我修改了 inline 附註的第 0 條以避免誤會 其實雖然很多人對 macro 深惡痛絕, 但只要你不要誤用,其實預處理器能成為你非常強有力的工具, 而且 C++ 本身有非常多的特性容易讓人誤用,不是只有 macro 而已。 工作上會遇到很多困難,完成任務和撰寫可讀性高、可維護、高效能的程式很重要 (就像你要設計程式自動產生程式時,你會發現 goto 實在是好用 XD) 關於 macro 當函數用,舉個簡單的例子: #define SHOW_LOG(...) \ do {\ printf("file: %s\n", __FILE__);\ printf("line: %d\n", __LINE__);\ printf(__VA_ARGS__);\ printf("\nLog_end\n");\ } while(0) int a = 0; SHOW_LOG("a = %d", a); 這會幫助你設計(debug 方便輸出)。 還有實務上大量使用的 assert macro, 這可是古老前輩傳下來的必備招數。 最後,加油!我是低手,希望你有天成了 C++ 大師之後,能照顧一下小弟。 ※ 編輯: applecool 來自: 123.110.164.174 (08/21 02:57)
文章代碼(AID): #1I4XM1Fo (C_and_CPP)
文章代碼(AID): #1I4XM1Fo (C_and_CPP)