所有文章除特別聲明外限嫌,均采用 CC BY-NC-SA 4.0 許可協(xié)議莹菱。轉(zhuǎn)載請(qǐng)注明來(lái)自 nixgnauhcuy's blog吓蘑!
如需轉(zhuǎn)載,請(qǐng)標(biāo)明出處!
前言
這里說(shuō)踩坑似乎不合適,應(yīng)該是自己坑自己闻坚,不過(guò)還是應(yīng)當(dāng)記錄下來(lái),時(shí)時(shí)刻刻提醒自己兢孝!
踩坑描述
不同項(xiàng)目對(duì) int鲤氢、unsigned int等數(shù)據(jù)類(lèi)型會(huì)使用 typedef 為這些數(shù)據(jù)類(lèi)型定義一個(gè)新的名字搀擂,這樣在移植項(xiàng)目的過(guò)程中,如果不想大規(guī)模的改動(dòng)源碼卷玉,則需要自己在頭文件中依據(jù)修改的名字自己用 typedef 聲明一下。
我在移植一個(gè)開(kāi)源項(xiàng)目時(shí)喷市,這個(gè)項(xiàng)目的數(shù)據(jù)類(lèi)型我自己的工程是沒(méi)有的相种,所以沒(méi)多想,動(dòng)手就在 Keil 中右鍵跳轉(zhuǎn)到已經(jīng)存在的數(shù)據(jù)類(lèi)型的頭文件品姓,當(dāng)時(shí)沒(méi)注意這個(gè)頭文件的名字是 stdint.h寝并,在聲明完開(kāi)源項(xiàng)目的數(shù)據(jù)類(lèi)型后,編譯也不會(huì)報(bào)錯(cuò)腹备。結(jié)果就是這樣一個(gè)小改動(dòng)衬潦,自己埋下了深坑??,每次想起都覺(jué)得十分不應(yīng)該植酥!
最關(guān)鍵的 unsigned long long 類(lèi)型居然被我寫(xiě)錯(cuò)镀岛,寫(xiě)成 __INT64 直接就變成了 long long 類(lèi)型,后面運(yùn)行的時(shí)候總是掛掉友驮,單步調(diào)試的時(shí)候總是在將數(shù)據(jù)轉(zhuǎn)換的時(shí)候掛掉漂羊,要么指針跑飛要么棧溢出的,調(diào)了整整快一個(gè)星期卸留,后面還以為是電腦的大小端和 cortexM3 的大小端不一致導(dǎo)致的走越,調(diào)整了數(shù)據(jù)轉(zhuǎn)換后,雖然不會(huì)運(yùn)行的時(shí)候掛掉耻瑟,但是總是會(huì)返回出錯(cuò)旨指。
最后還是大佬在旁邊幫我單步調(diào)試發(fā)現(xiàn)的數(shù)據(jù)類(lèi)型聲明的問(wèn)題,被無(wú)情的打臉和嘲諷后喳整,修正了問(wèn)題谆构,最后運(yùn)行的時(shí)候一遍就通過(guò)了。??
這里主要是兩點(diǎn)錯(cuò)誤:
- 1. 是修改了非本工程的文件算柳,修改了標(biāo)準(zhǔn) C 庫(kù)的文件 stdint.h低淡,這些標(biāo)準(zhǔn) C 庫(kù)的文件可能在很多地方都有用到,一般不能隨意更改的瞬项。
- 2. 是使用 typedef 為數(shù)據(jù)類(lèi)型另起名字的時(shí)候蔗蹋,居然將數(shù)據(jù)類(lèi)型寫(xiě)錯(cuò)了!
解決問(wèn)題
最后 copy 別人電腦下的stdint.h 文件囱淋,將自己修改的替換后猪杭,在自己工程的數(shù)據(jù)類(lèi)型聲明頭文件中,添加開(kāi)源代碼中的數(shù)據(jù)類(lèi)型后妥衣,問(wèn)題解決皂吮!這是一個(gè)粗心大意給自己制造的 BUG戒傻,付出了血的教訓(xùn),故此記錄下蜂筹,提醒自己需纳!