Re: [問題] 請問if判斷式裡是否可以用macro做condition
可以多行的
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
08/19 22:42, 1F
→
08/19 22:43, , 2F
08/19 22:43, 2F
還有 @
→
08/19 22:44, , 3F
08/19 22:44, 3F
→
08/19 23:46, , 4F
08/19 23:46, 4F
→
08/19 23:46, , 5F
08/19 23:46, 5F
→
08/20 07:18, , 6F
08/20 07:18, 6F
→
08/20 07:18, , 7F
08/20 07:18, 7F
→
08/20 07:19, , 8F
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)
討論串 (同標題文章)