C_and_CPP 板


LINE

A) 首先 line 16 輸出 error 才是正常的 ptr 的型別是 void* 因此 *ptr 會對應到 void 但是 void 是 incomplete type 所以只能屬於 default B) C11 加入 _Generic 關鍵字是神奇的進展 前處理器只做簡單的字串處理 完全不會涉及到判斷 macro argument 的型別 如果要在前處理階段時完成會使設計難度大增 因此時至今日 _Generic 仍然在編譯階段處理 _Generic 的語法如下: _Generic(controlling-expression, association-list) where association-list | type-name ':' expression [yacc syntax, (LA)LR] | association-list type-name ':' expression 事實上這並沒有想像中的糟 O.O 早期工程師遇到這種問題時 設計出了一套 hack 的方法 (compiler-dependent, GCC) #define is_of(x, t) (__builtin_types_compatible_p(__typeof__(x), t)) #define print(x) do { if (is_of(x, int)) \ printf("num = %d\n", x); \ else if (is_of(x, char)) \ printf("char = %c\n", x); \ else abort(); } while (0) int main (void) { char c = 'a'; int n = 10; float f = 1.2; print(n); // shows: num = 10 print(c); // char = a print(f); // Aborted (core dumped) } 這乍看下完美解決這個問題 但是當這樣的需求越來越大的時候 被編入語言標準的可能性就會大增 好確保能跨平臺使用沒問題 C) 原本的寫法會觸發編譯警告 雖然 _Gerenic 是 Generic Selection 沒錯 但是編譯器還是會在所有的 expression 裡檢查語意的正確性 由於輸入的型別並非固定 要同時滿足 printf 的 format specifier 本質上是不可能的 如果按照原先的代碼可能會產生 Wcast-align (Clang) 或是 Wstrict-aliasing (GCC) 等警告 因此比較好的寫法應該會是: #define var_sp(x) _Generic((x), char: "%s%c\n", int: "%s%d\n") #define prompt(x) _Generic((x), char: "char = ", int: "num = ") int main (void) { char c = 'a'; int n = 10; printf(var_sp(c), prompt(c), c); printf(var_sp(n), prompt(n), n); } ※ 引述《rice9547 (一碗飯)》之銘言: : : 預期的正確結果(Expected Output): : line 13, 14 輸出正確 : line 16卻輸出 error : 預期應該會和 line 13一樣 : : 程式碼(Code):(請善用置底文網頁, 記得排版) : https://ideone.com/1FaCEr --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.113.68.52
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1510795456.A.761.html
1F:推 james732: 完全不知道有這東西,感謝 11/16 10:55
2F:推 peterwu4: 好厲害,推一個~ 11/16 12:59
3F:推 ilikekotomi: 推 感謝分享 11/16 20:01
被m起來惹嗚 >///<
4F:推 wtchen: 已經躺進囉 11/16 20:57
5F:推 sppmg: 好文,一直對 _Generic 感興趣。不過 tcc 不支援的樣子... 11/16 22:32
6F:推 Lipraxde: 要怎麼樣才能厲害到要出什麼警告都知道啊? 11/16 22:58
Clang 那個是編譯了才知道的 XD ※ 編輯: Hazukashiine (122.116.185.23), 11/18/2017 11:39:06
7F:→ hunandy14: 凄い~勉強になりました~ 11/20 12:25







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:WOW站內搜尋

TOP