
嘻道奇闻
- 文章199742
- 阅读14625734
C语言泛型编程入门:手把手教你实现泛型函数
锛堝満鏅?锛夊綋浣犲惌鍝у惌鍝у啓浜嗕笁涓墦鍗板嚱鏁帮細print_int()銆乸rint_float()銆乸rint_string()锛岀獊鐒跺彂鐜拌繕瑕佸鐞嗙粨鏋勪綋鏁版嵁...杩欒皝椤跺緱浣忓晩锛熷挶浠粖澶╁氨鐢ㄥ満鏅寲鎬濈淮锛屾妸閲嶅浠g爜鎻夌浜嗛噸缁勩€?/p>
鈥?strong>鈥嬬湡瀹炲紑鍙戝洶澧冨疄褰曪細鈥?/strong>鈥?/p>
- 鐢ㄦ埛绠$悊绯荤粺瑕佸鐞唅nt鍨嬪勾榫勩€乫loat鍨嬭柂璧勩€乧har*濮撳悕
- 鐗╄仈缃戣澶囬渶瑕侀€傞厤涓嶅悓浼犳劅鍣ㄦ暟鎹牸寮?/li>
- 璺ㄥ钩鍙板紑鍙戞椂鏁版嵁浜ゆ崲鐨勫瓧鑺傚簭杞崲
鍦烘櫙涓€锛氫竾鑳芥墦鍗板嚱鏁?/h3>
锛堟帍鍑洪敭鐩樼幇鍦烘敼BUG锛夊亣璁句綘姝e湪璋冭瘯鐢ㄦ埛妗f妯″潡锛?/p>
c澶嶅埗//鍘熷浠g爜 void debug_int(int x) { printf("鍊?%d\n",x); } void debug_float(float x) { printf("鍊?%f\n",x); }
鈥?strong>鈥嬫敼閫犳楠わ細鈥?/strong>鈥?/p>
- 鐢╲oid*鎿﹂櫎绫诲瀷鐗瑰緛
c澶嶅埗void debug_generic(void* data, char type) { if(type == 'i') printf("INT:%d\n",*(int*)data); else if(type == 'f') printf("FLOAT:%f\n",*(float*)data); }
- 鍔犱釜绫诲瀷鏍囪瘑鍙傛暟锛?i'浠h〃int锛?f'浠h〃float锛?/li>
- 璋冪敤鏃跺己鍒惰浆鎹細
c澶嶅埗int age = 25; debug_generic(&age, 'i');
鈥?strong>鈥嬩絾杩欐牱鏈変釜鑷村懡浼も€斺€斿鏄撲紶閿欑被鍨嬫爣璇嗭紒鈥?/strong>鈥?杩欐椂鍊欏畯瀹氫箟灏辫鍑哄満浜嗭細
鍦烘櫙浜岋細鑷姩绫诲瀷缁戝畾
锛堣€佹澘绐佺劧瑕佸姞涓猯ong绫诲瀷鏀寔锛?/p>
c澶嶅埗#define DEBUG(T) \ void debug_##T(T value) { \ printf("%s : ",#T); \ _Generic((value), \ int: printf("%d\n",value), \ float: printf("%f\n",value) \ ); \ } DEBUG(int) //鐢熸垚debug_int鍑芥暟 DEBUG(float) //鐢熸垚debug_float鍑芥暟
鐜板湪璋冪敤鏃跺交搴曚笉鐢ㄧ绫诲瀷锛?/p>
c澶嶅埗debug_int(age); //鑷姩璇嗗埆绫诲瀷
鈥?strong>鈥嬬獊鐒跺彂鐜癈11鐨刜Generic钘忓湪瀹忛噷鏇村ソ鐢紒鈥?/strong>鈥?涓嶈繃瑕佸皬蹇冭€佹棫缂栬瘧鍣ㄥ彲鑳戒笉璁よ繖涓娉曘€?/p>
鍦烘櫙涓夛細璺ㄥ钩鍙版暟鎹墦鍖?/h3>
锛堢墿鑱旂綉璁惧瑕佷紶杈撴俯搴︿紶鎰熷櫒鐨刬nt鏁版嵁鍜屾箍搴︿紶鎰熷櫒鐨刦loat鏁版嵁锛?/p>
涓婄‖鏍告搷浣滐細
c澶嶅埗typedef struct { void* data; size_t type_size; char type_code; } GenericPacket; void send_packet(GenericPacket p) { char buffer[256]; memcpy(buffer, p.data, p.type_size); //杩欓噷娣诲姞缃戠粶浼犺緭浠g爜... } //浣跨敤绀轰緥 float humidity = 68.5; GenericPacket p = {&humidity, sizeof(float), 'H'}; send_packet(p);
鈥?strong>鈥嬫敞鎰忚繖涓柟妗堝儚璧伴挗涓濓細鈥?/strong>鈥?/p>
- 鉁?鍐呭瓨浣跨敤鐜囪秴楂?/li>
- 鉂?瀹屽叏渚濊禆绋嬪簭鍛樿嚜寰?/li>
- 馃挜 绫诲瀷鐮?H'蹇呴』鍏ㄥ眬缁熶竴
锛堢伒榄傛嫹闂級杩欎箞楹荤儲涓轰粈涔堜笉鎹㈣瑷€锛熼棶灏辨槸宓屽叆寮忓紑鍙戞病寰楅€夛紒鑰侀」鐩殑绁栦紶浠g爜灏卞儚绌夸簡涓夊勾鐨勮瀛愶紝鐮翠篃寰楁帴鐫€琛ャ€?/p>
鏈€鍚庤鐐逛汉璇濓細瀹為檯椤圭洰涓缓璁妸瀹忓拰void*缁勫悎浣跨敤銆傛瘮濡傜敤瀹忕敓鎴愮被鍨嬪0鏄庯紝瀹為檯鎿嶄綔浜ょ粰娉涘瀷鍑芥暟銆傝櫧鐒剁湅鐫€鍍忕敤鎵笟鍒掕埞锛屼絾鍦ㄨ祫婧愬彈闄愮殑鐜閲岋紝杩欏彲姣旂湡娉涘瀷鐪佸唴瀛樺浜嗐€傝浣忥紝鍦–璇█閲岀帺娉涘瀷锛屾渶閲嶈鐨勪笉鏄紭闆咃紝鑰屾槸娲荤潃鎶婁唬鐮佽窇璧锋潵锛?/p>