我有一個函式,它處理包含在 unsigned char 型別陣列中的資訊:
unsigned char LRCsimple(unsigned char *p, createLRC , unsigned char length)
{
}
適用于大多數無符號字符陣列。
現在,我有一個帶符號的陣列,當我使用這樣的函式時,它作業得很好,但是在編譯代碼時出現警告:
> ../src/apptcpipserver.c:102:9: warning: pointer targets in passing argument 1 of 'LRCsimple' differ in signedness [-Wpointer-sign]
if (0x01 == LRCsimple(apptcpipserverData.cRxedData,0x00,(apptcpipserverData.cRxedData[0x02] - 0x02)))
如果我想避免這個警告,我認為最佳解決方案是創建一個類似于上面的函式,但對于有符號陣列,如下所示:
unsigned char signedLRCsimple(char *p, createLRC , unsigned char length)
{
}
或者我還能做些什么來避免該警告訊息?
uj5u.com熱心網友回復:
嚴格的別名規則允許unsigned char和char別名。因此,您應該能夠重用LRCsimple進行處理char*。
因此signedLRCsimple可以實作為:
unsigned char signedLRCsimple(char *p, createLRC xxx, unsigned char length)
{
return LRCsimple((unsigned char*)p, xxx, length);
}
為了避免迫使客戶改變他們的代碼來使用signedLRCsimple,你可以使用通用選擇在形式C11推出_Generic。通常,它用于根據 的第一個引數的型別選擇函式指標_Generic。
#define LRCsimple(p, xxx, length) \
_Generic((p), unsigned char*: LRCsimple, \
char *: signedLRCsimple)(p, xxx, length)
每當LRCsimple被呼叫時,泛型選擇在LRCsimpleforunsigned char*和signedLRCsimplefor之間進行選擇char*。對于其他型別,會引發錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/334848.html
下一篇:如何檢查介面是否是指向切片的指標
