Re: [問題] C 語言下有類似 Template 的功能嗎?

作者: loveflames (咕啾咕啾魔法陣)   2017-05-24 14:59:25
如果有裝boost的話,可以這樣做,gcc相容boost.preprocessor
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
#include <boost/preprocessor/iteration/local.hpp>
//這裡放每個成員的名稱,此例子為3個成員
#define t (aaa,bbb,ccc)
//#的展開規則,所以得分兩行寫
#define str(s) _str(s)
#define _str(s) #s
//BOOST_PP_LOCAL_MACRO是每一輪的展開,n遞增
//這裡為函數本體,BOOST_PP_TUPLE_ELEM從上面的t抓token出來,從第一個抓起
#define BOOST_PP_LOCAL_MACRO(n) int BOOST_PP_CAT(get_,BOOST_PP_TUPLE_ELEM(3,n,t))(struct obj_s *self){\
int err_code = checkByMode(self,\
BOOST_PP_CAT(&_common_update_attr_,BOOST_PP_TUPLE_ELEM(3,n,t)),\
str(BOOST_PP_CAT(common_get_,BOOST_PP_TUPLE_ELEM(3,n,t))));\
if (err_code < 0){\
return err_code;\
}\
return (int)self-> BOOST_PP_TUPLE_ELEM(3,n,t);\
}
//表示BOOST_PP_LOCAL_MACRO為0->1->2的展開,即3個成員
#define BOOST_PP_LOCAL_LIMITS (0,2)
//實際展開
#include BOOST_PP_LOCAL_ITERATE()
作者: henry8168 (番薯猴)   2017-05-24 16:14:00
這有點猛!我還在google這段程式碼的細節,又有東西學的感覺好爽看得出用法和規律。想問些問題,裡面那個n的range是由#define BOOST_PP_LOCAL_LIMITS (0,2) 這行定義的嗎然後 #define str(s) _str(s) 和 #define _str(s) #s這種用法有沒有網站的詳細解說?沒這樣寫過,有點生疏.最後那個BOOST_PP_LOCAL_M..內的 \ 為什麼需要寫上?我找到的範例也有這些斜線。才學疏淺,不好意思。懂了,這跟console上輸入\的意思同樣嘛。https://kknews.cc/zh-tw/other/6y5qx3.html我看完這篇幫助滿大的 哈哈
作者: descent (「雄辯是銀,沉默是金」)   2017-05-24 23:14:00
linux driver 可用 boost 嗎?
作者: loveflames (咕啾咕啾魔法陣)   2017-05-24 23:48:00
boost.preprocessor產生的不是binary,只是source code只要編譯器本身吃boost就行要自己刻也是可以,preprocessor有metaprogramming的能力

Links booklink

Contact Us: admin [ a t ] ucptt.com